C++多线程数据访问
时间: 2023-11-14 16:00:09 浏览: 100
C++多线程数据访问可以通过队列和共享数据来实现。队列是一种封装好的数据结构,可以用来在多个线程之间进行数据交互,使用队列可以较少出错的可能性。共享数据则是指多个线程共同访问的数据,但是它容易产生数据争用的情况,即多个线程同时抢占某个资源,可能导致数据错乱或不一致的问题。
在C++中,可以通过使用原子类型(atomic)来实现多线程间的数据访问。原子类型是一种特殊的数据类型,可以保证对其进行读写操作是原子的,即不会被其他线程中断。使用原子类型可以避免数据竞争的问题。
另外,C++还提供了互斥量(mutex)和条件变量(condition_variable)来实现线程间的同步。互斥量用于保护共享资源,只有持有互斥量的线程才能访问共享资源,其他线程需要等待互斥量的释放才能访问。条件变量用于线程间的条件同步,可以实现线程的等待和唤醒操作。
下面是三种实现多线程数据访问的示例代码:
示例1: 使用原子类型
```
#include <iostream>
#include <thread>
#include <atomic>
using namespace std;
#define COUNT 10000
void inc(atomic<int> *p){
for(int i = 0; i < COUNT; i++){
(*p)++;
}
}
int main() {
atomic<int> a{0};
thread ta(inc, &a);
thread tb(inc, &a);
ta.join();
tb.join();
cout << "a = " << a << endl;
return 0;
}
```
示例2: 使用互斥量
```
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
#define COUNT 10000
static mutex g_mutex;
void inc(int *p){
for(int i = 0; i < COUNT; i++){
g_mutex.lock();
(*p)++;
g_mutex.unlock();
}
}
int main() {
int a{0};
thread ta(inc, &a);
thread tb(inc, &a);
ta.join();
tb.join();
cout << "a = " << a << endl;
return 0;
}
```
示例3: 使用条件变量
```
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
#define COUNT 10000
static mutex g_mutex;
static condition_variable g_cv;
static bool g_ready = false;
void inc(int *p){
for(int i = 0; i < COUNT; i++){
unique_lock<mutex> lock(g_mutex);
g_cv.wait(lock, []{ return g_ready; });
(*p)++;
g_ready = false;
g_cv.notify_one();
}
}
int main() {
int a{0};
thread ta(inc, &a);
thread tb(inc, &a);
ta.join();
tb.join();
cout << "a = " << a << endl;
return 0;
}
```
阅读全文