範例展示兩個執行緒共享全域計數器 counter,透過互斥鎖保護臨界區,避免競爭條件。
#include#include #include pthread_mutex_t mutex; int counter = 0; void *function(void *arg) { char *str = (char *)arg; for (int i = 0; str[i]; ++i) { pthread_mutex_lock(&mutex); putchar(str[i]); fflush(stdout); ++counter; pthread_mutex_unlock(&mutex); sleep(1); // 模擬工作 } return NULL; } int main(void) { pthread_mutex_init(&mutex, NULL); pthread_t t1, t2; pthread_create(&t1, NULL, function, "fulinux"); pthread_create(&t2, NULL, function, "wansui!"); pthread_join(t1, NULL); pthread_join(t2, NULL); pthread_mutex_destroy(&mutex); printf("\nFinal counter: %d\n", counter); return 0; }
gcc thread_mutex.c -o thread -lpthread ./thread # 輸出交錯顯示:f u l i n u x w a n s u i ! (每字元間隔 1 秒)
| 函式 | 用途 |
|---|---|
pthread_mutex_init(&mutex, NULL) | 初始化互斥鎖,屬性用預設值 |
pthread_mutex_lock(&mutex) | 鎖定,若已被鎖則阻塞等待 |
pthread_mutex_unlock(&mutex) | 解鎖,喚醒等待執行緒 |
pthread_mutex_destroy(&mutex) | 銷毀鎖,釋放資源 |
pthread_create() | 建立執行緒 |
pthread_join() | 等待執行緒結束 |
pthread_cleanup_push 保護。sleep()、I/O 放在鎖內。std::lock_guard;C 可自寫宏自動配對 lock/unlock。int rc = pthread_mutex_lock(&mutex);
if (rc != 0) { fprintf(stderr, "lock failed: %s\n", strerror(rc)); exit(1); }
// ... critical section ...
rc = pthread_mutex_unlock(&mutex);
if (rc != 0) { fprintf(stderr, "unlock failed: %s\n", strerror(rc)); exit(1); }