如何使用pthread_t實(shí)現(xiàn)線(xiàn)程間通信

小樊
83
2024-09-05 15:28:25

在C語(yǔ)言中,pthread_t 是一個(gè)用于表示線(xiàn)程的數(shù)據(jù)類(lèi)型

  1. 首先,包含所需的頭文件:
#include<stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
  1. 定義一個(gè)全局變量作為共享數(shù)據(jù)。這里我們使用一個(gè)簡(jiǎn)單的整數(shù)變量作為示例:
int shared_data = 0;
  1. 創(chuàng)建一個(gè)互斥鎖(mutex)以確保線(xiàn)程安全地訪(fǎng)問(wèn)共享數(shù)據(jù):
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
  1. 定義兩個(gè)線(xiàn)程函數(shù),分別用于生產(chǎn)者和消費(fèi)者。在這些函數(shù)中,我們將使用互斥鎖來(lái)確保對(duì)共享數(shù)據(jù)的訪(fǎng)問(wèn)是同步的:
void *producer(void *arg) {
    int i;
    for (i = 0; i < 10; i++) {
        pthread_mutex_lock(&lock);
        shared_data++;
        printf("Producer: %d\n", shared_data);
        pthread_mutex_unlock(&lock);
        sleep(1);
    }
    return NULL;
}

void *consumer(void *arg) {
    int i;
    for (i = 0; i < 10; i++) {
        pthread_mutex_lock(&lock);
        printf("Consumer: %d\n", shared_data);
        shared_data--;
        pthread_mutex_unlock(&lock);
        sleep(1);
    }
    return NULL;
}
  1. 在主函數(shù)中創(chuàng)建兩個(gè)線(xiàn)程,一個(gè)用于生產(chǎn)者,另一個(gè)用于消費(fèi)者:
int main() {
    pthread_t producer_thread, consumer_thread;

    // 創(chuàng)建生產(chǎn)者線(xiàn)程
    if (pthread_create(&producer_thread, NULL, producer, NULL) != 0) {
        perror("Failed to create producer thread");
        exit(1);
    }

    // 創(chuàng)建消費(fèi)者線(xiàn)程
    if (pthread_create(&consumer_thread, NULL, consumer, NULL) != 0) {
        perror("Failed to create consumer thread");
        exit(1);
    }

    // 等待線(xiàn)程完成
    pthread_join(producer_thread, NULL);
    pthread_join(consumer_thread, NULL);

    // 銷(xiāo)毀互斥鎖
    pthread_mutex_destroy(&lock);

    return 0;
}

這個(gè)示例展示了如何使用 pthread_t 和互斥鎖實(shí)現(xiàn)線(xiàn)程間通信。生產(chǎn)者線(xiàn)程和消費(fèi)者線(xiàn)程都可以訪(fǎng)問(wèn)共享數(shù)據(jù) shared_data,但是通過(guò)使用互斥鎖,我們確保了在任何時(shí)候只有一個(gè)線(xiàn)程可以訪(fǎng)問(wèn)該數(shù)據(jù)。

0