【发布时间】:2011-06-14 19:14:25
【问题描述】:
我有一个从主线程调用的函数:
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);
【问题讨论】:
标签: c++ c multithreading pthreads signals