linux

linux pthread怎样实现线程间通信

小樊
81
2024-12-29 03:19:17
栏目: 智能运维

在Linux中,使用POSIX线程(pthread)库进行线程间通信有多种方法。以下是一些常用的线程间通信方式:

  1. 互斥锁(Mutex):互斥锁是一种同步机制,用于确保多个线程在访问共享资源时不会发生冲突。pthread提供了pthread_mutex_t类型的互斥锁,以及用于操作互斥锁的函数,如pthread_mutex_lock()pthread_mutex_unlock()

示例:

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

pthread_mutex_t lock;
int shared_data = 0;

void* increment(void* arg) {
    pthread_mutex_lock(&lock);
    shared_data++;
    pthread_mutex_unlock(&lock);
    return NULL;
}

int main() {
    pthread_t thread1, thread2;
    pthread_mutex_init(&lock, NULL);

    pthread_create(&thread1, NULL, increment, NULL);
    pthread_create(&thread2, NULL, increment, NULL);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    printf("Shared data: %d\n", shared_data);

    pthread_mutex_destroy(&lock);
    return 0;
}
  1. 条件变量(Condition Variable):条件变量是一种同步机制,允许线程等待某个条件成立。pthread提供了pthread_cond_t类型的条件变量,以及用于操作条件变量的函数,如pthread_cond_wait()pthread_cond_signal()

示例:

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

pthread_mutex_t lock;
pthread_cond_t cond;
int shared_data = 0;

void* producer(void* arg) {
    pthread_mutex_lock(&lock);
    shared_data++;
    printf("Producer: %d\n", shared_data);
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&lock);
    return NULL;
}

void* consumer(void* arg) {
    pthread_mutex_lock(&lock);
    while (shared_data == 0) {
        pthread_cond_wait(&cond, &lock);
    }
    shared_data--;
    printf("Consumer: %d\n", shared_data);
    pthread_mutex_unlock(&lock);
    return NULL;
}

int main() {
    pthread_t producer_thread, consumer_thread;
    pthread_mutex_init(&lock, NULL);
    pthread_cond_init(&cond, NULL);

    pthread_create(&producer_thread, NULL, producer, NULL);
    pthread_create(&consumer_thread, NULL, consumer, NULL);

    pthread_join(producer_thread, NULL);
    pthread_join(consumer_thread, NULL);

    pthread_cond_destroy(&cond);
    pthread_mutex_destroy(&lock);
    return 0;
}
  1. 信号量(Semaphore):信号量是一种计数器,用于控制对共享资源的访问。pthread提供了sem_t类型的信号量,以及用于操作信号量的函数,如sem_wait()sem_post()

  2. 消息队列(Message Queue):消息队列是一种通信方式,允许线程发送和接收消息。Linux提供了System V消息队列,可以通过msgget()msgsnd()msgrcv()等函数进行操作。

这些方法可以根据不同的场景和需求进行选择。在实际应用中,可能需要结合多种方法来实现复杂的线程间通信。

0
看了该问题的人还看了