int k_condvar_broadcast(struct k_condvar *condvar)
k_condvar_signal 用于唤醒所有等待的线程。
intz_impl_k_condvar_broadcast(struct k_condvar *condvar){struct k_thread *pending_thread;
k_spinlock_key_t key;int woken =0;
key =k_spin_lock(&lock);SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_condvar, broadcast, condvar);/* wake up any threads that are waiting to write */while((pending_thread =z_unpend_first_thread(&condvar->wait_q))!=NULL){
woken++;arch_thread_return_value_set(pending_thread,0);z_ready_thread(pending_thread);}SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_condvar, broadcast, condvar, woken);z_reschedule(&lock, key);return woken;}
#define BUFFER_SIZE 10staticchar buffer[BUFFER_SIZE];staticint buffer_count =0;staticstruct k_mutex buffer_mutex;staticstruct k_condvar buffer_condvar;voidproducer_thread(void*arg){while(1){/* Produce data and add it to the buffer */char data ='A'+(rand()%26);k_mutex_lock(&buffer_mutex, K_FOREVER);while(buffer_count == BUFFER_SIZE){/* Buffer is full, wait for consumer to consume data */k_condvar_wait(&buffer_condvar,&buffer_mutex, K_FOREVER);}
buffer[buffer_count++]= data;k_condvar_signal(&buffer_condvar);k_mutex_unlock(&buffer_mutex);k_sleep(K_MSEC(1000));}}voidconsumer_thread(void*arg){while(1){k_mutex_lock(&buffer_mutex, K_FOREVER);while(buffer_count ==0){/* Buffer is empty, wait for producer to add data */k_condvar_wait(&buffer_condvar,&buffer_mutex, K_FOREVER);}char data = buffer[--buffer_count];k_condvar_signal(&buffer_condvar);k_mutex_unlock(&buffer_mutex);/* Consume data */printk("Consumed data: %c\n", data);k_sleep(K_MSEC(1000));}}voidmain(void){k_mutex_init(&buffer_mutex);k_condvar_init(&buffer_condvar);k_thread_create(&producer_thread_data, producer_thread_stack,K_THREAD_STACK_SIZEOF(producer_thread_stack),
producer_thread,NULL,NULL,NULL,1,0, K_NO_WAIT);k_thread_create(&consumer_thread_data, consumer_thread_stack,K_THREAD_STACK_SIZEOF(consumer_thread_stack),
consumer_thread,NULL,NULL,NULL,1,0, K_NO_WAIT);}