在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
Using same std::mutex & lock object everywhere for all instances of locking and unlocking in all parallel threads in C++
我有 2 个线程访问共享资源:
共享资源是下面的双向链表:
std::list<RowColumns> ll;
struct RowColumns
{
int x;
float y;
vector<vector<string> vec2D;
.....//many other fields;
}
线程 1: 将数据写入此共享资源。
线程 2: 从此共享资源读取数据并写入文件。
两个线程并行运行,即当数据由 Thread1 写入共享资源时,线程 2 应该继续读取写入的数据并将其写入文件,每个"X"时间间隔。 因此,T1 和 T2 的代码有许多访问共享资源的语句。因此,为了避免 1 个线程劫持共享资源,我只需为每个 acess 锁定和解锁,以便我可以实现并发,并且两个线程都有机会运行。
我的问题是我可以在任何地方对所有锁定和解锁实例使用相同的互斥变量吗? 示例使我的问题更清楚:
在下面的示例中,如您所见,相同的互斥对象"singleMutex" 也使用相同的"lock1"unique_lock((锁对象 T1 和 T2 线程用于所有不同元素的访问 共享资源。将使用相同的互斥锁和相同锁的这种用法 在所有锁定和解锁实例中工作并真正服务于互斥锁 目的?正如我们所知,互斥变量和锁不附加到任何 对象或资源,我认为它应该有效。同时我 混淆d因为,如果我们到处都使用相同的互斥锁,那么我们在哪里 需要多个多文本?
std::mutex singleMutex;
Thread1():
{
RunStatement_WITH_NO_SHARED_RESOURCE ();
while(someCondition())
{
std::unique_lock<std::mutex> lock1(singleMutex);
RunStatement_ACCESSING_SHARED_RESOURCE();
lock1.unlock();
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_WITH_NO_SHARED_RESOURCE ();
lock1.lock();
RunStatement_ACCESSING_SHARED_RESOURCE();
lock1.unlock();
}
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_WITH_NO_SHARED_RESOURCE ();
std::unique_lock<std::mutex> lock1(singleMutex);
RunStatement_ACCESSING_SHARED_RESOURCE();
lock1.unlock();
RunStatement_WITH_NO_SHARED_RESOURCE ();
lock1.lock();
RunStatement_ACCESSING_SHARED_RESOURCE();
lock1.unlock();
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_WITH_NO_SHARED_RESOURCE ();
lock1.lock();
RunStatement_ACCESSING_SHARED_RESOURCE();
lock1.unlock();
Thread_2((:
{
RunStatement_WITH_NO_SHARED_RESOURCE ();
std::unique_lock<std::mutex> lock1(singleMutex);
RunStatement_ACCESSING_SHARED_RESOURCE();
lock1.unlock();
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_WITH_NO_SHARED_RESOURCE ();
lock1.lock();
RunStatement_ACCESSING_SHARED_RESOURCE();
lock1.unlock();
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_ACCESSING_SHARED_RESOURCE();
lock1.unlock();
RunStatement_WITH_NO_SHARED_RESOURCE ();
lock1.lock();
RunStatement_ACCESSING_SHARED_RESOURCE();
lock1.unlock();
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_WITH_NO_SHARED_RESOURCE ();
RunStatement_WITH_NO_SHARED_RESOURCE ();
lock1.lock();
RunStatement_ACCESSING_SHARED_RESOURCE();
lock1.unlock();
我不确定你是否真的理解互斥体的概念。
互斥锁(mutual exclusion(用于锁定对共享资源(例如整数、列表或任何对象(的访问。即使资源由多个变量组成,也只需要一个互斥锁。
一个好的做法是将资源的访问封装在一个函数中,所以你只需要为每个访问函数实现一次互斥锁:
#include <mutex>
int g_resource = 42;
std::mutex g_mutex;
int getResource()
{
std::lock_guard<std::mutex> lock(g_mutex);
return g_resource;
// auto unlocking, when object 'lock' is destroyed on exit of block
}
void incrementResource()
{
std::lock_guard<std::mutex> lock(g_mutex);
g_resource++;
}
//...
- 对于原始数据类型,我建议使用
std::atomic<T>
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 我是否必须使用neak_ptr.lock()只是为了测试它是否指向有效的对象