Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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
如何使wait notify更快,或者是否有其他方法实现wait notify功能? 在我的C++程序中,我有一个对象 x>代码>,当一个线程想要处理 x>代码>时,它必须等待“x->状态”被设置。在此线程等待期间(通过调用wait()),另一个线程可以修_C++_Multithreading_C++11_Condition Variable - Fatal编程技术网

如何使wait notify更快,或者是否有其他方法实现wait notify功能? 在我的C++程序中,我有一个对象 x>代码>,当一个线程想要处理 x>代码>时,它必须等待“x->状态”被设置。在此线程等待期间(通过调用wait()),另一个线程可以修

如何使wait notify更快,或者是否有其他方法实现wait notify功能? 在我的C++程序中,我有一个对象 x>代码>,当一个线程想要处理 x>代码>时,它必须等待“x->状态”被设置。在此线程等待期间(通过调用wait()),另一个线程可以修,c++,multithreading,c++11,condition-variable,C++,Multithreading,C++11,Condition Variable,如何使wait notify更快,或者是否有其他方法实现wait notify功能? 在我的C++程序中,我有一个对象 x>代码>,当一个线程想要处理 x>代码>时,它必须等待“x->状态”被设置。在此线程等待期间(通过调用wait()),另一个线程可以修改“X->state”。当一个线程修改“X->state”时,它调用notify\u one()。在本例中,我发现一个线程修改“X->state”,另一个线程从等待中唤醒的时间非常高,大约为20-50us(取决于机器上运行的线程数量)。这意味着

如何使wait notify更快,或者是否有其他方法实现wait notify功能?

在我的C++程序中,我有一个对象<代码> x>代码>,当一个线程想要处理<代码> x>代码>时,它必须等待“x->状态”被设置。在此线程等待期间(通过调用

wait()
),另一个线程可以修改“X->state”。当一个线程修改“X->state”时,它调用
notify\u one()
。在本例中,我发现一个线程修改“X->state”,另一个线程从等待中唤醒的时间非常高,大约为20-50us(取决于机器上运行的线程数量)。这意味着当一个线程修改状态并发出通知时,另一个线程仍然需要很长时间才能从等待中唤醒。是否有任何方法可以减少这一时间,或者是否有任何其他方法可以实现相同的功能。

我认为您看到的开销就是线程上下文切换的开销。解决这个问题的一种方法是让信号器直接在信号线程上执行服务员的延续。即,代替线程1执行
cv.wait();继续工作()和线程2执行
cv.notify_one(),让线程2直接执行
继续工作()。请注意,根据
continue\u working()
的性质,此转换可能相当复杂。不使用wait/notify,您的等待线程可以在原子变量上旋转,而通知线程只需要更新变量。这将是快速的,如果你不超额订阅你的CPU。您不会指出您使用的硬件或工作负载是什么样的,但如果您使用超线程(即使用的逻辑线程多于物理线程),您可能希望使用自旋循环提示,例如x86的
\u mm\u pause()
固有、ARM上的
\u yield()
固有等。该机器有2个CPU,每个有8个核心。每个线程提交请求,协调器将在此时窗提交请求的线程期间选择一个线程作为引导线程。leader线程可以批量处理所有请求,其他线程只需等待。当leader完成批处理时,它会通知其他人,然后其他人可以返回。如果等待线程只是旋转而不是使用wait/notify,那么当线程数少于CPU内核时,它可以提高性能。如果我们有更多的线程,它就不能很好地工作
continue\u working()
只是返回这个函数调用。是否有任何方法可以在leader线程中执行
continue\u working()
。是否有原因导致批处理中只有一个线程处理请求?这件作品能被分成几条线吗?