使用锁C ++

时间:2015-11-08 10:29:20

标签: c++ arrays multithreading

我拥有的是一个数组,我想锁定一个元素,以便其他元素不能改变它。

更好地描述这一点的方法是向您展示:

Array A = new Array;

Thread1() {

  while(array hasn't been completely changed)  { 
     grab lock for random element within the array
     alter the elements to this array
     free the lock for the element
  }
}

Thread2() {

  while(array hasn't been completely changed)  { 
     grab lock for random element within the array
     alter the elements to this array
     free the lock for the element
  }
}

目标是让两个线程对元素执行操作但锁定它,以便其他线程无法访问它。

1 个答案:

答案 0 :(得分:1)

Yoy可能希望使用mutex作为以下示例代码:

#include <mutex>
#include <thread>

using namespace std;


mutex mtx[12];
int   A  [12];

auto modArray = [&mtx, &A](int position){
    while(!mutex[i].try_lock());
    modifiyArrayAtIndex(A, i);
    mtx[i].unlock();
};

thread t1(modArray, 5);
thread t2(modArray, 5);
thread t3(modArray, 6);
thread t4(modArray, 6);
t1.join();
t2.join();
t3.join();
t4.join();

只需将数组与相等大小的互斥锁数组匹配,锁定与您可能要修改的索引相对应的互斥锁。 t1和t2线程处理索引5数据,而t3和t4线程处理索引6数据。

互斥锁只是在线程之间同步对所需资源器的访问,

  

而(!mtx.try_lock())

主动等待部分不是表现最佳的选择,但可以胜任。