中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

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
肥西县| 徐汇区| 焦作市| 富蕴县| 邯郸市| 策勒县| 延长县| 安乡县| 安溪县| 大庆市| 临夏市| 岳池县| 望奎县| 永福县| 澎湖县| 会昌县| 香格里拉县| 天等县| 运城市| 石城县| 合山市| 丹棱县| 赞皇县| 霍林郭勒市| 昌宁县| 邛崃市| 祥云县| 屯昌县| 苗栗市| 海晏县| 乐至县| 襄樊市| 丹阳市| 酉阳| 水富县| 桃源县| 宜州市| 上饶县| 嘉定区| 旬邑县| 海林市|