dum*_*mmy 13 c++ multithreading c++11
我想我的问题很常见,但它让我发疯:
我有一个包含5个线程的多线程应用程序.其中4个线程完成它们的工作,如网络通信和本地文件系统访问,然后将它们的输出写入此表单的数据结构:
struct Buffer {
std::vector<std::string> lines;
bool has_been_modified;
}
Run Code Online (Sandbox Code Playgroud)
第5个线程将这些缓冲区/结构打印到屏幕:
Buffer buf1, buf2, buf3, buf4;
...
if ( buf1.has_been_modified ||
buf2.has_been_modified ||
buf3.has_been_modified ||
buf4.has_been_modified )
{
redraw_screen_from_buffers();
}
Run Code Online (Sandbox Code Playgroud)
如何保护缓冲区在被读取或写入时不被覆盖?
我找不到合适的解决方案,虽然我认为这必须是一个安静的常见问题.
谢谢.
pha*_*tom 10
你应该使用互斥锁.互斥体类是std::mutex.使用C++ 11,您可以使用std::lock_guard<std::mutex>RAII封装互斥锁.所以你要改变你的Buffer结构
struct Buffer {
std::vector<std::string> lines;
bool has_been_modified;
std::mutex mutex;
};
Run Code Online (Sandbox Code Playgroud)
无论何时你读或写缓冲区,或者has_been_modified你会这样做
std::lock_guard<std::mutex> lockGuard(Buffer.mutex); //Do this for each buffer you want to access
... //Access buffer here
Run Code Online (Sandbox Code Playgroud)
并且互斥锁将在lock_guard被销毁时自动释放.
您可以在此处阅读有关互斥锁的更多信息.
您可以在缓冲区周围使用一个或多个互斥锁,以确保多个线程不能同时修改它们。
// Mutex shared between the multiple threads
std::mutex g_BufferMutex;
void redraw_screen_from_buffers()
{
std::lock_guard<std::mutex> bufferLockGuard(g_BufferMutex);
//redraw here after mutex has been locked.
}
Run Code Online (Sandbox Code Playgroud)
然后,在修改缓冲区时,缓冲区修改代码将必须锁定相同的互斥锁。
void updateBuffer()
{
std::lock_guard<std::mutex> bufferLockGuard(g_BufferMutex);
// update here after mutex has been locked
}
Run Code Online (Sandbox Code Playgroud)
其中包含一些互斥锁示例。
| 归档时间: |
|
| 查看次数: |
2110 次 |
| 最近记录: |