我可以同时锁定多个变量吗?

Sha*_*awn 6 c++ multithreading pthreads

我问的是关于多线程的问题.

说我有两个全局向量,

std::vector<MyClass1*> vec1 
Run Code Online (Sandbox Code Playgroud)

std::vector<MyClass2*> vec2. 
Run Code Online (Sandbox Code Playgroud)

另外,我总共有4个线程可以访问vec1vec2.我可以编写如下代码吗?

void thread_func()
// this is the function that will be executed by a thread
{
    MyClass1* myObj1 = someFunction1(); 
    MyClass2* myObj2 = someFunction2();

    // I want to push back vec1, then push back vec2 in an atomic way
    pthread_mutex_lock(mutex);
    vec1.push_back(myObj1);
    vec2.push_back(myObj2);
    pthread_mutex_unlock(mutex);
}

for(int i=0; i<4; i++)
{
    pthread_t tid;
    pthread_create(&tid, NULL, thread_func, NULL);
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是,我想在vec1上执行push_back,然后在vec2上执行push_back .

我是新手,我觉得只能用互斥锁锁定一个变量.换句话说,只能在pthread_mutex_lock(mutex)pthread_mutex_unlock(mutex)之间放置vec1.push_back(myObj1)vec2.push_back(myObj2 ).

我不知道上面的代码是否正确.如果我错了,有人可以纠正我吗?

Ron*_*per 5

你的代码是正确的.互斥锁是锁定的东西,而不是变量.您锁定互斥锁以保护一段代码不被多个线程执行,最常见的是保护数据,但通常它实际上是在保护一段代码.

  • 如果我可以指出一个潜在的问题:`push_back()`可能引发异常.在这种情况下,您将失去对互斥锁的控制,该互斥锁可能会对所有线程都保持阻塞状态.执行关键secton ia尝试catch块.或者使用`std :: threads`和`std :: lock_guard()`代替...... (2认同)