8.3.5 原子操作
在同一时刻只有唯一的线程对这个资源进行访问。这有点类似互斥对象对共享资源的访问的保护,但是原子操作更加接近底层,因而效率更高。
(1)pthread
#include <stdatomic.h>
atomic_int atomicVariable;
atomic_init(&atomicVariable, 0);int value = atomic_load(&atomicVariable);// 原子加载原子变量的值
atomic_store(&atomicVariable, value);// 储存原子变量
int oldValue = atomic_fetch_add(&atomicVariable, value);//原子加法操作
oldValue = atomic_fetch_sub(&atomicVariable, value);//原子减法
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdatomic.h>
#include <pthread.h>#define NUM_THREADS 4
#define ITERATIONS 1000000// 全局原子变量
atomic_int sharedVariable = 0;// 线程函数,每个线程对共享变量进行一百万次的加法操作
void* threadFunc(void* arg) {for (int i = 0; i < ITERATIONS; ++i) {atomic_fetch_add(&sharedVariable, 1);}return NULL;
}int main() {pthread_t threads[NUM_THREADS];// 创建多个线程for (int i = 0; i < NUM_THREADS; ++i) {if (pthread_create(&threads[i], NULL, threadFunc, NULL) != 0) {fprintf(stderr, "Error creating thread\n");exit(EXIT_FAILURE);}}// 等待线程执行完毕for (int i = 0; i < NUM_THREADS; ++i) {if (pthread_join(threads[i], NULL) != 0) {fprintf(stderr, "Error joining thread\n");exit(EXIT_FAILURE);}}// 输出最终的共享变量值printf("Final value of sharedVariable: %d\n", atomic_load(&sharedVariable));return 0;
}
(2)std::atomic
使用步骤:
#include <atomic>
std::atomic<int> total(0); // 初始化
int value = total.load(); // 加载
total.store(42); //原子储存
int result = total.fetch_add(5); //加法
示例代码:
#include <iostream>
#include <thread>
#include <atomic>
#include <time.h>
#include <mutex>
#include <atomic>#define MAX 100000
#define THREAD_COUNT 20// 原子操作
std::atomic_int total(0);void threadTask()
{for (int i = 0; i < MAX; i++){total += 1;total -= 1;}
}int main()
{clock_t start = clock();std::thread t[THREAD_COUNT];for (int i = 0; i < THREAD_COUNT; ++i){t[i] = std::thread(threadTask);}for (int i = 0; i < THREAD_COUNT; ++i){t[i].join();}clock_t finish = clock();std::cout << "result:" << total << std::endl; // 计算结果std::cout << "duration:" << finish - start << "ms" << std::endl; // 计算耗时return 0;
}