gpt4 book ai didi

c++ - pthread_cond_wait 没有从 pthread_cond_broadcast 唤醒

转载 作者:搜寻专家 更新时间:2023-10-31 00:03:41 25 4
gpt4 key购买 nike

在我的程序中有一部分代码等待被其他部分代码唤醒:
这是进入休眠的部分:

void flush2device(int task_id) {

if (pthread_mutex_lock(&id2cvLock) != SUCCESS) {
cerr << "system error - exiting!!!\n";
exit(1);
}

map<int,pthread_cond_t*>::iterator it;

it = id2cv.find(task_id);

if(it == id2cv.end()){

if (pthread_mutex_unlock(&id2cvLock) != SUCCESS) {
cerr << "system error\n UNLOCKING MUTEX flush2device\n";
exit(1);
}

return;
}

cout << "Waiting for CV signal" <<endl;

if(pthread_cond_wait(it->second, &id2cvLock)!=SUCCESS){
cerr << "system error\n COND_WAIT flush2device - exiting!!!\n";
exit(1);
}
cout << "should be right after " << task_id << " signal" << endl;


if (pthread_mutex_unlock(&id2cvLock) != SUCCESS) {
cerr << "system error\n UNLOCKING MUTEX flush2device -exiting!!!\n";
exit(1);
}


在代码的另一部分中,有唤醒部分(信号):

//id2cv is a map <int, pthread_cond_t*> variable. - the value is a pointer to the cv on
//which we call with the broadcast method.
if(pthread_mutex_lock(&id2cvLock)!=SUCCESS){
cerr <<"system error\n";
exit(1);
}

id2cv.erase(nextBuf->_taskID);

cout << "In Thread b4 signal, i'm tID " <<nextBuf->_taskID << endl;
if (pthread_cond_broadcast(nextBuf->cv) != 0) {
cerr << "system error SIGNAL_CV doThreads\n";
exit(1);
}
cout << "In doThread, after erasing id2cv " << endl;
if(pthread_mutex_unlock(&id2cvLock)!=SUCCESS){
cerr <<"system error\n;
exit(1);
}

大多数运行都很好,但偶尔程序会停止“ react ” - 第一种方法(上面)只是没有通过 cond_wait 部分 - 似乎没有人真正向她发送信号时间(或出于其他原因) - 而另一个方法(代码的最后一部分是它的一部分)继续运行。

我在互斥锁和信号的逻辑上哪里出了问题?在调用 cond_wait 和 cond_broadcast 方法之前,我已经检查过 pthread_cond_t 变量是否仍然“有效”,并且该区域似乎没有任何错误。

最佳答案

尽管名称如此,pthread_cond_wait 是一个un条件等待for 条件。除非您确认有东西要等待,并且它正在等待的东西必须受到关联互斥锁的保护,否则您不得调用 pthread_cond_wait

条件变量是无状态的,应用程序负责存储正在等待的事物的状态,称为“谓词”。

规范模式是:

pthread_mutex_lock(&mutex);
while(!ready_for_me_to_do_something)
pthread_cond_wait(&condvar, &mutex);
do_stuff();
ready_for_me_to_do_something=false; // this may or may not be appropriate
pthread_mutex_unlock(&mutex);

和:

pthread_mutex_lock(&mutex);
ready_for_me_to_do_something=true;
pthread_cond_broadcast(&condvar);
pthread_mutex_unlock(&mutex);

注意此代码如何维护 ready_for_me_to_do_something 变量中的状态,并且等待线程在循环中等待,直到该变量为真。请注意互斥量如何保护共享变量,以及它如何保护条件变量(因为它也在线程之间共享)。

这不是使用条件变量的唯一正确方法,但使用任何其他方法很容易遇到麻烦。即使没有理由等待,您也会调用 pthread_cond_wait。如果等你妹妹提车回家再用,她已经回来了,你要等很久。

关于c++ - pthread_cond_wait 没有从 pthread_cond_broadcast 唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5582075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com