您好, 我是多线程编程的新手。 我正在尝试创建一个创建线程THREAD1的代码,在它完成某些操作后,它会触发另外两个线程,比如THREAD2和THREAD3,然后退出。
我写了两个可能的解决方案。
1)使用条件变量(不工作:在某些情况下我遇到死锁):
pthread_mutex_t ready_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t ready_cond = PTHREAD_COND_INITIALIZER;
bool ready = false;
void* trigger(void*);
void* func1(void*);
void* func2(void*);
int main()
{
pthread_t thread1;
pthread_t thread2;
pthread_t thread3;
pthread_create(&thread1, 0, &trigger, 0);
pthread_create(&thread2, 0, &func1, 0);
pthread_create(&thread3, 0, &func2, 0);
pthread_join(thread1, 0);
pthread_join(thread2, 0);
pthread_join(thread3, 0);
}
void *trigger(void*)
{
pthread_mutex_lock(&ready_mutex);
ready = true;
pthread_cond_broadcast(&ready_cond);
pthread_mutex_unlock(&ready_mutex);
return 0;
}
void *func1(void*)
{
while (!ready) // Needed to avoid spuriuos wake-up
{
pthread_mutex_lock(&ready_mutex);
pthread_cond_wait(&ready_cond, &ready_mutex);
pthread_mutex_unlock(&ready_mutex);
}
std::cout << "In 'func1'>> Do something" << std::endl;
return 0;
}
void *func2(void*)
{
while (!ready) // Needed to avoid spuriuos wake-up
{
pthread_mutex_lock(&ready_mutex);
pthread_cond_wait(&ready_cond, &ready_mutex);
pthread_mutex_unlock(&ready_mutex);
}
std::cout << "In 'func2'>> Do something" << std::endl;
return 0;
}
2)THREAD1直接创建另外两个线程。
pthread_mutex_t ready_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t ready_cond = PTHREAD_COND_INITIALIZER;
pthread_t thread1;
pthread_t thread2;
pthread_t thread3;
void* trigger(void*);
void* func1(void*);
void* func2(void*);
int main()
{
pthread_create(&thread1, 0, &trigger, 0);
pthread_join(thread1, 0);
pthread_join(thread2, 0);
pthread_join(thread3, 0);
}
void *trigger(void*)
{
std::cout << "In 'trigger'>> Do something" << std::endl;
pthread_create(&thread2, 0, &func1, 0);
pthread_create(&thread3, 0, &func2, 0);
return 0;
}
void *func1(void*)
{
std::cout << "In 'func1'>> Do something" << std::endl;
return 0;
}
void *func2(void*)
{
std::cout << "In 'func2'>> Do something" << std::endl;
return 0;
}
我想知道你的意见。 非常感谢你
答案 0 :(得分:5)
使用条件变量(不工作:在某些情况下我遇到死锁):
在检查共享变量ready
的状态时,代码不会锁定互斥锁。当它锁定时,互斥锁ready
可能已经很好地改变了,这就是你看到死锁的原因。
使用条件变量等待状态更改的正确版本是(错误检查省略):
pthread_mutex_lock(&ready_mutex);
while(!ready) // Needed to avoid spuriuos wake-up
pthread_cond_wait(&ready_cond, &ready_mutex);
// ready == true here
pthread_mutex_unlock(&ready_mutex);
以上假设只有在保持相同的互斥锁时才会更改ready
。