【问题标题】:Waiting for Memory Value to Change等待内存值改变
【发布时间】: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


【解决方案1】:

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

在桌面上传递消息吗?那将允许您阻止。也许是一个套接字?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多