亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

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
华阴市| 汉源县| 陈巴尔虎旗| 从江县| 太仓市| 温州市| 泰兴市| 鄂伦春自治旗| 华宁县| 安塞县| 上蔡县| 博野县| 循化| 滨州市| 博爱县| 鞍山市| 富平县| 石河子市| 绥阳县| 禹州市| 乌拉特前旗| 连平县| 忻州市| 赤壁市| 广元市| 五常市| 上栗县| 商南县| 无锡市| 时尚| 鄂州市| 霞浦县| 肥西县| 萝北县| 迁安市| 日照市| 镇雄县| 蕲春县| 巴里| 通渭县| 连城县|