【发布时间】:2017-07-20 02:31:19
【问题描述】:
我有一个问题,即主线程中的函数被阻塞,直到在另一个线程中设置了局部变量。我用信号量来阻塞主线程执行:
int sendRequest(Message request, void *data)
{
semaphore waitForReply;
volatile int result = 0;
volatile int retData[100];
client->sendRequest(request, [&result, &retData](const Message& reply){ // Callback is called from a different thread
result = reply.result;
memcpy(retData, reply.retData, sizeof(retData));
waitForReply.signal();
})
waitForReply.wait();
//At this line we want result var to be updated.
memcpy(data, retData, sizeof(retData));
return result;
}
问题是使用 volatile int result 是否保证返回结果是从回调接收到的实际值?这是解决此问题的最佳方法还是使用普通变量和互斥锁更好?
数组 retData 的情况如何? (请不要介意数组的大小)
【问题讨论】:
-
不,
volatilein 是不够的。 -
谢谢,你知道如何解决这个问题吗?
-
您的代码在我看来是正确的。
volatile没有做任何有用的事情,你应该删除它。您的回调仅在数据被复制出来后才会发出信号量,因此您可以保证在wait()返回后获得正确的数据。或者,换句话说,不是volatile保证了这里的正确行为。保证来自signal()在数据复制后被调用,wait()将阻塞并等待该信号。 -
@NikosC。这是我不确定的事情,如果我错了,请纠正我。如果当result = reply.result;时,result的新值还没有写入内存而是缓存在寄存器的某个地方,那么返回的结果(return result;)是旧值怎么办?
标签: c++ multithreading