我拥有的是一个数组,我想锁定一个元素,以便其他元素不能改变它。
更好地描述这一点的方法是向您展示:
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
}
}
目标是让两个线程对元素执行操作但锁定它,以便其他线程无法访问它。
答案 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())
主动等待部分不是表现最佳的选择,但可以胜任。