修改线程中的数据 [英] Modifying data in threads
本文介绍了修改线程中的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个类的结构如下:
I have a class with the following structure:
class Nginx_sender
{
private:
std::vector<std::string> mMessagesBuffer;
boost::mutex mMutex;
void SendMessage(const std::string &msg)
{
mMutex.lock();
mMessagesBuffer.push_back(msg);
mMutex.unlock();
std::cout << "Vector size: " << mMessagesBuffer.size() << std::endl;
}
void NewThreadFunction()
{
while(true) {
mMutex.lock();
if (mMessagesBuffer.size() >= 1) std::cout << ">=1\n";
mMutex.unlock();
boost::this_thread::sleep(boost::posix_time::milliseconds(200));
}
}
};
int main()
{
Nginx_sender *NginxSenderHandle;
boost::thread sender(boost::bind(&Nginx_sender::NewThreadFunction, &NginxSenderHandle));
// ...
}
NewThreadFunction
正在新线程中运行,它检查 mMessagesBuffer
的大小。现在我调用 main
函数中的任何地方: NginxSenderHandle-> SendMessage(Test);
NewThreadFunction
is running in new thread and it checks the size of mMessagesBuffer
. Now I call anywhere in main
function: NginxSenderHandle->SendMessage("Test");
这显示了:第一次,
2
但是! NewThreadFunction
它总是== 0.为什么会是?
But! In NewThreadFunction
it's always == 0. Why could it be?
推荐答案
我敢打赌编译器缓存一些mMessagesBuffer内部在线程本地缓存。请尝试在mMessagesBuffer中添加volatile关键字,以停用此类优化。
I bet compiler is caching some of mMessagesBuffer internals in thread-local cache. Try adding 'volatile' keyword to mMessagesBuffer to disable such optimizations.
这篇关于修改线程中的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文