在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象

Using same std::mutex & lock object everywhere for all instances of locking and unlocking in all parallel threads in C++

本文关键字:对象 lock mutex std 锁定 任何地 C++ 并行 解锁 线程 实例      更新时间:2023-10-16

我有 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>