在 Linux 系統中,pthread 庫提供了用于線程同步的機制,主要包括互斥鎖(mutex)、條件變量(condition variable)和屏障(barrier)等。下面簡要介紹這些同步原語的實現原理和使用方法。
使用 pthread 互斥鎖的基本步驟如下:
#include <pthread.h>
pthread_mutex_t lock;
// 初始化互斥鎖
pthread_mutex_init(&lock, NULL);
// 加鎖
pthread_mutex_lock(&lock);
// 臨界區代碼
// 解鎖
pthread_mutex_unlock(&lock);
// 銷毀互斥鎖
pthread_mutex_destroy(&lock);
使用 pthread 條件變量的基本步驟如下:
#include <pthread.h>
pthread_mutex_t lock;
pthread_cond_t cond;
// 初始化互斥鎖和條件變量
pthread_mutex_init(&lock, NULL);
pthread_cond_init(&cond, NULL);
// 線程等待條件變量
pthread_mutex_lock(&lock);
while (/* 條件不成立 */) {
pthread_cond_wait(&cond, &lock);
}
// 臨界區代碼
// 通知其他線程條件已成立
pthread_mutex_unlock(&lock);
pthread_cond_signal(&cond);
// 銷毀互斥鎖和條件變量
pthread_mutex_destroy(&lock);
pthread_cond_destroy(&cond);
使用 pthread 屏障的基本步驟如下:
#include <pthread.h>
pthread_mutex_t lock;
pthread_cond_t cond;
int barrier_count;
// 初始化互斥鎖、條件變量和屏障
pthread_mutex_init(&lock, NULL);
pthread_cond_init(&cond, NULL);
barrier_count = 3; // 假設有3個線程需要到達屏障
// 線程等待屏障
pthread_mutex_lock(&lock);
while (barrier_count > 0) {
pthread_cond_wait(&cond, &lock);
barrier_count--;
}
// 臨界區代碼
// 通知其他線程可以繼續執行
pthread_mutex_unlock(&lock);
pthread_cond_broadcast(&cond);
// 銷毀互斥鎖和條件變量
pthread_mutex_destroy(&lock);
pthread_cond_destroy(&cond);
這些是 Linux pthread 庫中實現線程同步的主要方法。在實際應用中,可以根據需求選擇合適的同步原語來保護共享資源和協調線程執行順序。