91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

c語言多線程怎么訪問全局變量

小億
185
2024-01-30 15:44:35
欄目: 編程語言

在C語言中,多線程訪問全局變量需要注意線程同步問題,以避免出現數據競爭和不確定的結果。以下是幾種常見的方法:

  1. 使用互斥鎖(mutex):在訪問全局變量之前,線程先獲取互斥鎖,訪問結束后再釋放互斥鎖。這樣可以確保同一時間只有一個線程能夠訪問全局變量。
#include <pthread.h>

int global_variable;
pthread_mutex_t mutex;

void* thread_function(void* arg) {
    // 獲取互斥鎖
    pthread_mutex_lock(&mutex);

    // 訪問全局變量
    global_variable++;

    // 釋放互斥鎖
    pthread_mutex_unlock(&mutex);

    return NULL;
}

int main() {
    // 初始化互斥鎖
    pthread_mutex_init(&mutex, NULL);

    // 創建線程
    pthread_t thread;
    pthread_create(&thread, NULL, thread_function, NULL);

    // 等待線程結束
    pthread_join(thread, NULL);

    // 銷毀互斥鎖
    pthread_mutex_destroy(&mutex);

    return 0;
}
  1. 使用信號量(semaphore):設置一個信號量為1,在訪問全局變量之前,線程先執行P操作(等待),訪問結束后再執行V操作(釋放)。
#include <pthread.h>
#include <semaphore.h>

int global_variable;
sem_t sem;

void* thread_function(void* arg) {
    // 等待信號量
    sem_wait(&sem);

    // 訪問全局變量
    global_variable++;

    // 釋放信號量
    sem_post(&sem);

    return NULL;
}

int main() {
    // 初始化信號量
    sem_init(&sem, 0, 1);

    // 創建線程
    pthread_t thread;
    pthread_create(&thread, NULL, thread_function, NULL);

    // 等待線程結束
    pthread_join(thread, NULL);

    // 銷毀信號量
    sem_destroy(&sem);

    return 0;
}
  1. 使用條件變量(condition variable):設置一個條件變量和一個互斥鎖,線程通過互斥鎖來保護對全局變量的訪問,在訪問之前,線程等待條件變量滿足,訪問結束后,通過條件變量通知其他等待的線程。
#include <pthread.h>

int global_variable;
pthread_mutex_t mutex;
pthread_cond_t cond;

void* thread_function(void* arg) {
    // 獲取互斥鎖
    pthread_mutex_lock(&mutex);

    // 等待條件變量滿足
    while (global_variable == 0) {
        pthread_cond_wait(&cond, &mutex);
    }

    // 訪問全局變量
    global_variable++;

    // 釋放互斥鎖
    pthread_mutex_unlock(&mutex);

    return NULL;
}

int main() {
    // 初始化互斥鎖和條件變量
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    // 創建線程
    pthread_t thread;
    pthread_create(&thread, NULL, thread_function, NULL);

    // 修改全局變量,并發送條件變量通知
    pthread_mutex_lock(&mutex);
    global_variable++;
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&mutex);

    // 等待線程結束
    pthread_join(thread, NULL);

    // 銷毀互斥鎖和條件變量
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);

    return 0;
}

通過以上方法,可以確保多個線程能夠安全地訪問全局變量,避免數據競爭和不確定的結果。

0
绥宁县| 弋阳县| 包头市| 偃师市| 江川县| 平遥县| 威信县| 西平县| 桂阳县| 满洲里市| 健康| 西林县| 仙游县| 怀柔区| 古丈县| 宜兰市| 新乡县| 吴忠市| 萍乡市| 名山县| 揭东县| 城口县| 砚山县| 静宁县| 彭州市| 博罗县| 汉寿县| 衡山县| 常宁市| 浠水县| 宁都县| 化隆| 靖宇县| 南皮县| 威海市| 古田县| 桦南县| 会东县| 东海县| 玉溪市| 海原县|