等待内存值更改

Waiting for Memory Value to Change

本文关键字:内存 等待      更新时间:2023-10-16

我有两个独立的进程,一个客户端和服务器进程。它们使用共享内存进行链接。

客户端将首先将共享内存的某个部分更改为输入值,然后翻转一个位,指示输入有效并且该值尚未计算,从而开始他的响应。

服务器等待终止信号或新数据进入。现在相关的服务器代码如下所示:

 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 循环占用了太多资源。

此问题的大多数解决方案通常使用多线程应用程序,在这种情况下,您可以使用条件变量和互斥锁来控制服务器进程的进度。由于这些是单线程应用程序,因此此解决方案不适用。是否有一种轻量级解决方案可以等待这些内存位置更改,同时又不完全占用硬件线程?

您可以轮询或阻止...您也可以等待中断,但这也可能需要一些轮询或阻止。

消息传递是否摆在桌面上?这将允许您阻止。也许是插座?

您还可以将信号从一个进程发送到另一个进程。您将为接收进程编写中断处理程序。

请注意,当中断处理程序运行时,它会抢占进程的执行线程。换句话说,当处理程序运行时,主线程暂停。因此,如果锁可能已经持有,您的中断处理程序不应抓取锁,因为它会造成死锁情况。您可以通过使用可重入锁或一种在抓取锁之前禁用中断的特殊锁类型来避免这种情况。抓住锁的东西:mutex.lock(显然(,I/O,分配内存,condition.signal(不太明显(。