グローバル変数にLinuxでミューテックスを追加の方法

排他制御をグローバル変数に付与する場合は、pthreadライブラリを使用できます。次の例コードを参照してください。

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

int global_var = 0;
pthread_mutex_t mutex;

void* thread_function(void* arg) {
    // 加锁
    pthread_mutex_lock(&mutex);

    // 修改全局变量
    global_var++;

    // 解锁
    pthread_mutex_unlock(&mutex);

    return NULL;
}

int main() {
    pthread_t thread1, thread2;

    // 初始化互斥锁
    pthread_mutex_init(&mutex, NULL);

    // 创建线程
    pthread_create(&thread1, NULL, thread_function, NULL);
    pthread_create(&thread2, NULL, thread_function, NULL);

    // 等待线程结束
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    // 打印最终结果
    printf("global_var = %d\n", global_var);

    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);

    return 0;
}

上記のコードでは、pthreadライブラリ内のpthread_mutex_t型のデータを定義して、ミューテックス変数のmutexを使っています。各スレッドでグローバル変数であるglobal_varを変更する際には、pthread_mutex_lock関数を用いてロックをかけ、グローバル変数の変更が完了した後にpthread_mutex_unlock関数を用いてロックを解除しています。これにより、同一時間に1つのスレッドだけがグローバル変数を変更することが保証され、競合条件の発生を回避できます。なお、pthread_mutex_initとpthread_mutex_destroyでミューテックスの初期化と破棄を行っています。

各スレッドでpthread_mutex_lockとpthread_mutex_unlockを必ずペアで使うことを忘れなければ、デッドロックやその他問題の原因になりません。

bannerAds