【发布时间】:2018-07-01 19:09:15
【问题描述】:
我有两个独立的进程,一个客户端进程和一个服务器进程。它们使用共享内存链接。
客户端将首先将共享内存的某个部分更改为输入值,然后翻转一个位以指示输入有效且该值尚未计算,从而开始其响应。
服务器等待终止信号或新数据进入。现在相关的服务器代码如下所示:
while(!((*metadata)&SERVER_KILL)){
//while no kill signal
bool valid_client = ((*metadata)&CLIENT_REQUEST_VALID)==CLIENT_REQUEST_VALID;
bool not_already_finished = ((*metadata)&SERVER_RESPONSE_VALID)!=SERVER_RESPONSE_VALID;
if(valid_client & not_already_finished){
*int2 = sqrt(*int1);
*metadata = *metadata | SERVER_RESPONSE_VALID;
//place square root of input in memory, set
//metadata to indicate value has been found
}
}
这样做的问题是while循环占用了太多资源。
此问题的大多数解决方案通常使用多线程应用程序,在这种情况下,您可以使用条件变量和互斥锁来控制服务器进程的进程。由于这些是单线程应用程序,因此此解决方案不适用。是否有一种轻量级的解决方案,允许等待这些内存位置全部更改,同时不完全占用硬件线程?
【问题讨论】:
-
如果你在 Linux 上,this might help。如果您使用的是其他操作系统,请说明是哪个操作系统。
-
在Windows上可以使用
WaitOnAddress():“等待指定地址的值改变”。 Raymond Chen's blog 有关于如何有效使用它的文章。
标签: c++ multithreading condition-variable