等待内存值更改
Waiting for Memory Value to Change
我有两个独立的进程,一个客户端和服务器进程。它们使用共享内存进行链接。
客户端将首先将共享内存的某个部分更改为输入值,然后翻转一个位,指示输入有效并且该值尚未计算,从而开始他的响应。
服务器等待终止信号或新数据进入。现在相关的服务器代码如下所示:
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(不太明显(。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何在不等待检索的情况下获取C++中的内存位置?
- 等待内存值更改
- 我应该为等待工作线程的主线程使用哪种内存顺序
- 在忙碌等待循环中是否需要内存屏障或原子操作