我有一个从主线程调用的函数:
void create_thread() {
pthread_t bg_thread;
pthread_create(&bg_thread, NULL, run_in_background, NULL);
//wait here
pthread_mutex_lock(&MAIN_MUTEX);
pthread_cond_wait(&wakeUpMainThread, &MAIN_MUTEX);
pthread_mutex_unlock(&MAIN_MUTEX);
pthread_cond_signal(wakeUpBgThread);
}下面是在后台线程中运行的函数的简短版本:
void* run_in_background(void* v) {
pthread_mutex_t mutex;
pthread_cond_t cond;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
//NOTE: wakeUpBgThread == cond
save_condition_and_mutex(&cond, &mutex);
pthread_mutex_lock(&mutex);
{
pthread_cond_signal(&wakeUpMainThread);
while( run_condition ) {
pthread_cond_wait(&cond, &mutex);
do_smth();
}
}
pthread_mutex_unlock(&mutex);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
pthread_exit(NULL);
}所以我们的目标是:
1. Create a thread in the main one.
2. Make the main thread sleep until the signal from that thread.
3. Make the background thread sleep until the signal from the main thread.
4. Invoke the background thread from the main one.问题是:有时在
pthread_cond_signal(&wakeUpMainThread);调度程序立即切换到主线程,并激发后台线程的唤醒信号。在此调度程序切换回后台线程并开始等待已触发的信号后,它将永远休眠。
问:有没有办法强制后台线程执行代码,直到
pthread_cond_wait(&cond, &mutex);发布于 2011-06-15 03:38:35
在create_thread中对pthread_mutex_lock的调用需要在之前进行,而不是在 pthread_create之后。否则,您将遇到竞争条件。
发布于 2011-06-15 03:51:20
使用信号量?信号量信号不会丢失-它们只是增加计数&所以后台线程将在信号量发出信号后再次运行,即使它实际上还没有找到时间等待它。
Rgds,Martin
发布于 2011-06-15 03:20:54
听起来你最好的办法就是使用条件。有一个互斥锁和一个条件。Main初始化两个线程,获取互斥锁,创建线程,然后根据条件进入睡眠状态。Child抓取锁(在main等待条件之后)做工作(或者做工作,然后抓取锁),然后发信号通知条件(你可以决定是在信号之前还是之后释放锁--重要的一点是你抓住了它)。Main随后被唤醒并继续处理。
pthread_cond_wait()和朋友就是你所看到的。
https://stackoverflow.com/questions/6348783
复制相似问题