std::string ms_tasks;
std::mutex ms_tasks_mutex;
void AddTask(const std::string& task)
{
std::lock_guard<std::mutex> _lock(ms_tasks_mutex);
//...
ms_tasks = task;
//...
}
void DealTask()
{
std::lock_guard<std::mutex> _lock(ms_tasks_mutex);
//read and wirte ms_tasks here
//...
}
//线程1
void poll1()
{
while(...)
{
std::string s=...
//...
AddTask(s);
//...
//sleep some time
}
}
//线程2
void poll2()
{
while(...)
{
//...
DealTask();
//...
//sleep some time
}
}
类似以上的代码,运行一段时间后就崩了,两线程同时操作同一字符串,我已加锁,看了这编文章后恍然大悟:
https://www.cnblogs.com/alantu2018/p/8503270.html
原来是触发了std::string的copy-on-write机制了。
把代码改成:
ms_tasks = task.c_str();
就解决问题了
本文探讨了C++中多线程环境下std::string引发的竞态条件,特别是在copy-on-write机制下导致的问题。通过具体代码案例,展示了如何使用std::string的c_str()方法避免内存竞争,确保线程安全。
2987

被折叠的 条评论
为什么被折叠?



