Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ pthread_cond_广播是如何工作的?_C++_C_Linux_Pthreads - Fatal编程技术网

C++ pthread_cond_广播是如何工作的?

C++ pthread_cond_广播是如何工作的?,c++,c,linux,pthreads,C++,C,Linux,Pthreads,假设广播线程在只有3个线程等待时进行广播,第4个线程调用pthread\u cond\u wait在广播线程完成广播后,第4个线程是否会退出等待状态。以及如何重置条件变量,以便广播线程可以在稍后向等待的线程重播 第四个线程是否会脱离等待状态 不,除非在线程4等待时发出条件变量信号 手册页: pthread\u cond\u broadcast()调用取消阻止指定条件变量cond上当前阻止的所有线程 如果cond上当前没有被阻止的线程,则pthread\u cond\u signal()和pthr

假设广播线程在只有3个线程等待时进行广播,第4个线程调用
pthread\u cond\u wait
在广播线程完成广播后,第4个线程是否会退出等待状态。以及如何重置条件变量,以便广播线程可以在稍后向等待的线程重播

第四个线程是否会脱离等待状态

不,除非在线程4等待时发出条件变量信号

手册页:

pthread\u cond\u broadcast()
调用取消阻止指定条件变量
cond
上当前阻止的所有线程

如果
cond
上当前没有被阻止的线程,则
pthread\u cond\u signal()和
pthread\u cond\u broadcast()
函数无效

第四个线程是否会脱离等待状态

不,除非有另一个广播或信号

如何重置条件变量,使广播 线程有时可以稍后重新广播到等待的线程

最简单的设想是,条件变量所做的一切都在与条件变量关联的互斥锁下同步。因此,在您广播时,所有等待的内容(不知何故)都会进入一种状态,即试图唤醒并获取互斥。然后,广播线程释放互斥锁。因此,当您广播时,不是真正的条件变量被“重置”,而是前三个线程从等待条件变量变为等待互斥

为了等待condvar,第四个线程必须首先获取互斥锁。这可能发生在前三个线程设法唤醒并使用互斥锁之前或之后,但它显然发生在广播之后,因此您的第四个线程没有处于“尝试唤醒”状态,而是处于“等待信号或广播”状态

事实上,它比这更复杂——实际上,广播条件变量不需要持有互斥锁。因此,条件变量必须包含一些额外的内部同步(我不知道linux上的具体细节),以确保在广播之前等待的所有线程作为单个操作更改其状态

不过,通常情况下,您也可以持有互斥对象进行广播,因为您在刚刚更改了服务员希望看到的内容时进行广播,并且从许多线程中查看的内容都是使用互斥对象进行同步的。还有一些尴尬的情况,你可以通过一直这样做来避免