多个函数访问不同的数据加锁方式
时间: 2023-12-08 12:05:22 浏览: 20
当多个函数需要访问不同的数据时,可以使用多个锁来保护它们的访问。这种方式被称为粗粒度锁(Coarse-grained Locking)。其实现方式是为每个需要保护的数据定义一个独立的锁,并在访问该数据时对其进行加锁和解锁。
下面是一个使用粗粒度锁的示例代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx1;
std::mutex mtx2;
int data1 = 0;
int data2 = 0;
void worker1() {
for (int i = 0; i < 100; i++) {
mtx1.lock();
data1++;
mtx1.unlock();
}
}
void worker2() {
for (int i = 0; i < 100; i++) {
mtx2.lock();
data2++;
mtx2.unlock();
}
}
int main() {
std::thread t1(worker1);
std::thread t2(worker2);
t1.join();
t2.join();
std::cout << "Data1 = " << data1 << std::endl;
std::cout << "Data2 = " << data2 << std::endl;
return 0;
}
```
在上面的示例代码中,我们定义了两个std::mutex类型的mtx1和mtx2对象,分别用于保护共享变量data1和data2的访问。在worker1()函数中,我们对data1进行了100次加一的操作,并使用mtx1对象进行了加锁和解锁;在worker2()函数中,我们对data2进行了100次加一的操作,并使用mtx2对象进行了加锁和解锁。在main()函数中,我们启动了两个线程分别执行worker1()和worker2()函数,并等待它们执行完毕。最后,我们输出了data1和data2的值。
需要注意的是,在使用粗粒度锁时,需要保证每个锁只保护一个数据,否则会出现锁冲突的情况。此外,在使用粗粒度锁时,如果一个线程需要同时访问多个数据,就需要对所有涉及的锁进行加锁,否则也会出现数据不一致的情况。