当一个线程调用pthread_cond_signal()
时,Unix网络编程说pthread_cond_signal()
只是只有一个线程,因为它不是pthread_cond_broadcast()
。这意味着没有竞争条件。但是,本书没有说明将通知哪个主题,以及如何通知。该函数是否随机唤醒线程?
答案 0 :(得分:5)
如果在条件变量上阻塞了多个线程,则调度策略应确定线程被解除阻塞的顺序。
“调度策略”是操作系统决定的顺序。这是下面链接中列出的四个中的一个,但你真的不知道(至少没有一些令人印象深刻的hackery)哪一个是“第一”。它也无所谓 - 等待条件的所有线程应该同样准备好继续 - 否则你就会遇到设计问题。
Scheduling policies in Linux Kernel对某些Linux政策进行了一些讨论,如果重要的话,你可以从那里谷歌。
答案 1 :(得分:1)
请参阅下面我的示例,它将帮助您非常清楚地理解它。我使用3个互斥锁和3个条件。使用下面的示例,您可以同步或优先处理C中的任意数量的线程。如果您在此处看到第一个线程,它锁定了互斥锁1并等待cond1,同样第二个线程锁定了互斥锁lock2并等待条件cond2和第3个线程锁定的互斥锁lock3和等待条件cond3。这是创建它们之后所有线程的当前情况,现在所有线程都在等待信号在其条件变量上进一步执行。在主线程中(即main函数,每个程序都有一个主线程,在C / C ++中这个主线程由操作系统自动创建,一旦控制传递给kernal的main方法)我们调用pthread_cond_signal(& cond1);一旦这个系统调用完成,在cond1上等待的thread1将被释放,它将开始执行。一旦完成任务,它将调用pthread_cond_signal(& cond3);现在正在等待条件cond3的线程,即thread3将被释放,它将开始执行并将调用pthread_cond_signal(& cond2);这将释放在条件cond2上等待的线程,即在这种情况下为thread2。
include<pthread.h>
pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond3 = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock3 = PTHREAD_MUTEX_INITIALIZER;
int TRUE = 1;
void print(char *p)
{
printf("%s",p);
}
void * threadMethod1(void *arg)
{
printf("In thread1\n");
do{
pthread_mutex_lock(&lock1);
pthread_cond_wait(&cond1, &lock1);
print("I am thread 1st\n");
pthread_cond_signal(&cond3);/* Now allow 3rd thread to process */
pthread_mutex_unlock(&lock1);
}while(TRUE);
pthread_exit(NULL);
}
void * threadMethod2(void *arg)
{
printf("In thread2\n");
do
{
pthread_mutex_lock(&lock2);
pthread_cond_wait(&cond2, &lock2);
print("I am thread 2nd\n");
pthread_cond_signal(&cond1);
pthread_mutex_unlock(&lock2);
}while(TRUE);
pthread_exit(NULL);
}
void * threadMethod3(void *arg)
{
printf("In thread3\n");
do
{
pthread_mutex_lock(&lock3);
pthread_cond_wait(&cond3, &lock3);
print("I am thread 3rd\n");
pthread_cond_signal(&cond2);
pthread_mutex_unlock(&lock3);
}while(TRUE);
pthread_exit(NULL);
}
int main(void)
{
pthread_t tid1, tid2, tid3;
int i = 0;
printf("Before creating the threads\n");
if( pthread_create(&tid1, NULL, threadMethod1, NULL) != 0 )
printf("Failed to create thread1\n");
if( pthread_create(&tid2, NULL, threadMethod2, NULL) != 0 )
printf("Failed to create thread2\n");
if( pthread_create(&tid3, NULL, threadMethod3, NULL) != 0 )
printf("Failed to create thread3\n");
pthread_cond_signal(&cond1);/* Now allow first thread to process first */
sleep(1);
TRUE = 0;/* Stop all the thread */
sleep(3);
/* this is how we join thread before exit from a system */
/*
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);*/
exit(0);
}
答案 2 :(得分:0)
是的,它会随机唤醒一个线程。由操作系统决定哪一个将被唤醒。