Win*_*ten 2 c++ string multithreading stdstring c++11
我想使std :: string追加函数线程安全,因为我从不同的线程追加一个特定的字符串.
我是c ++的初学者,所以我不确定这可能会出现什么问题.
我正在考虑的解决方案是使用而不是使用 somestring.append("appendthis");
使用以下代码:
bool appendtsReady = true;
void appendts(std::string& originalString, char* app)
{
while (!appendtsReady) {}
appendtsReady = false;
originalString.append(app);
appendtsReady = true;
}
appendts(somestring, "appendthis");
Run Code Online (Sandbox Code Playgroud)
我希望如果附加字符串,新请求
appendts(somestring, "appendthis_from_different_thread");将被循环捕获,直到前一个附加完成.
这个解决方案太天真了吗?
这不是一种线程安全的方式.即使appendtsReady是原子布尔(如果你不改变逻辑)!原因如下:
考虑没有人写过bool并且两个线程执行appendts.两人都读了博尔.现在可以读到真的吗?是! 因为在appendtsReadywhile循环中的读取和下面的行中的写入之间存在微小的延迟!如此微小,它几乎总能工作,但第二个线程的读取可能恰好在延迟期间,所以两者都读true.
解决方案:让他们分享一个std::mutex.
std::mutex mutex;
void appendts(std::string& originalString, char* app)
{
std::lock_guard<std::mutex> lock(mutex);
originalString.append(app);
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以从两个线程调用此方法,前提是两个线程都知道相同的互斥锁.要么全局声明它(不太好),要么将互斥锁的引用传递给两个线程.
std::mutex通过锁定和解锁工作,就像你想要的布尔变量一样.但是,std::mutex具有线程安全性.
我推荐使用a std::lock_guard而不是mutex.lock(); work(); mutex.unlock();因为它提供了RAII的优点,即如果work()返回,抛出或中断或其他什么,互斥锁自动解锁.
| 归档时间: |
|
| 查看次数: |
1046 次 |
| 最近记录: |