[英]pthreads: a thread that triggers other threads
Hello, I'm new to multi-thread programming. 您好,我是多线程编程的新手。 I'm trying to create a code that creates a thread THREAD1, that, after it has done something, it triggers two other threads, say THREAD2 and THREAD3, and then exits. 我正在尝试创建一个创建线程THREAD1的代码,该线程完成某些操作后会触发另外两个线程,例如THREAD2和THREAD3,然后退出。
I wrote two possible solutions. 我写了两个可能的解决方案。
1) Use of condition variables (DOESN'T WORK: in some case I get a deadlock): 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 directly creates the two other threads. 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;
}
I would like to know your opinion. 我想知道你的意见。 Thank you very much 非常感谢你
Use of condition variables (DOESN'T WORK: in some case I get a deadlock): 使用条件变量(不起作用:在某些情况下会出现死锁):
The code doesn't lock the mutex when checking the state of shared variable ready
. 检查共享变量ready
的状态时,代码不会锁定互斥体。 When it does lock the mutex ready
may have well changed by that time, this is why you see deadlocks. 当它锁定的互斥ready
可能到那个时候已经随之改变,这就是为什么你看到死锁。
The correct version to wait for state change with a condition variable is (error checking omitted): 使用条件变量等待状态更改的正确版本是(省略错误检查):
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);
The above assumes that ready
is ever changed only when the same mutex is held. 以上假设仅当保持相同的互斥锁时, ready
才会更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.