我有一个从主线程调用的函数:
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);
答案 0 :(得分:2)
pthread_mutex_lock
中对create_thread
的来电需要才能 pthread_create
,而不是之后。否则你就有竞争条件。
答案 1 :(得分:1)
使用信号量?信号量信号不会丢失 - 它们只会增加计数和数量。因此,在信号量发出信号后,后台线程将运行agan,即使它实际上还没有等待它。
RGDS, 马丁
答案 2 :(得分:0)
听起来你最好的选择是使用条件。有互斥和条件。 Main初始化两者,抓取互斥锁,创建线程,然后在条件下进入睡眠状态。儿童抓住锁(在主要等待条件后)完成工作(或者工作然后抓住锁),然后发出信号(你可以决定是否在信号之前或之后释放锁 - 重要的一点就是你抓住了它)。然后主要唤醒并继续处理。
pthread_cond_wait()和朋友就是你所看到的。
答案 3 :(得分:0)
在主线程上的信号之前,您不会锁定互斥锁。如果您想要可预测的行为 - 您应该在等待呼叫和信号呼叫之前锁定相同的互斥锁。