为了实现多线程访问一个全局变量 g,并使用原子操作 __sync_bool_compare_and_swap 来避免多线程并发冲突,可以按照以下方式编写 C 代码。

假设我们有一个全局变量 g 表示某种状态,我们需要在多线程环境中安全地更新它。

#include <stdio.h>
#include <pthread.h>
#include <stdbool.h>

// 全局变量
volatile int g = 0;

// 线程函数
void* thread_func(void* arg) {
    int thread_id = *(int*)arg;
    for (int i = 0; i < 10; ++i) {
        int old_val = g;
        int new_val = old_val + 1;

        // 使用 __sync_bool_compare_and_swap 原子操作更新 g
        bool success = __sync_bool_compare_and_swap(&g, old_val, new_val);
        if (success) {
            printf("Thread %d: Successfully changed g from %d to %d\n", thread_id, old_val, new_val);
        } else {
            printf("Thread %d: Failed to change g\n", thread_id);
        }
    }
    return NULL;
}

int main() {
    const int NUM_THREADS = 4;
    pthread_t threads[NUM_THREADS];
    int thread_ids[NUM_THREADS];

    // 创建线程
    for (int i = 0; i < NUM_THREADS; ++i) {
        thread_ids[i] = i;
        pthread_create(&threads[i], NULL, thread_func, &thread_ids[i]);
    }

    // 等待所有线程完成
    for (int i = 0; i < NUM_THREADS; ++i) {
        pthread_join(threads[i], NULL);
    }

    printf("Final value of g: %d\n", g);
    return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
代码解释:
  1. 全局变量 g:声明为 volatile 以防止编译器优化导致的不可预测行为。
  2. 线程函数 thread_func:每个线程执行的函数,尝试使用 __sync_bool_compare_and_swap 原子操作更新 g。如果操作成功,则打印成功消息;否则,打印失败消息。
  3. 创建线程:使用 pthread_create 创建多个线程。
  4. 等待线程完成:使用 pthread_join 等待所有线程完成。

这个示例展示了如何在多线程环境中使用 __sync_bool_compare_and_swap 原子操作安全地更新全局变量 g,避免数据竞争和并发冲突。