我有两个独立的进程,一个客户端和服务器进程。它们使用共享内存进行链接。
客户端将首先将共享内存的某个部分更改为输入值,然后翻转一个指示输入有效且该值尚未计算的位来开始响应。
服务器等待一个终止信号或新数据进入。现在相关的服务器代码如下:
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循环占用了太多资源。
此问题的大多数解决方案通常都是使用多线程应用程序,在这种情况下,您可以使用条件变量和互斥锁来控制服务器进程的进度。由于这些是单线程应用程序,因此该解决方案不适用。是否有一个轻量级的解决方案,允许等待这些内存位置更改所有内存位置,而不是完全占用硬件线程?
答案 0 :(得分:0)
您可以轮询或阻止...您也可以等待中断,但这可能还需要一些轮询或阻止。
桌上是否有消息传递?这会让你阻止。也许是插座?
您还可以将信号从一个进程发送到另一个进程。您将为接收进程编写中断处理程序。
请注意,当中断处理程序运行时,它会抢占进程的执行线程。换句话说,在处理程序运行时,主线程暂停。因此,如果锁定已经存在,你的中断处理程序不应该获取锁定,因为它会产生死锁情况。您可以通过使用可重入锁定或在获取锁定之前禁用中断的特殊锁定类型之一来避免这种情况。抓住锁定的东西:mutex.lock(显然),I / O,分配内存,condition.signal(更不那么明显)。