在Linux中,使用POSIX线程(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;
}
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;
}
信号量(Semaphore):信号量是一种计数器,用于控制对共享资源的访问。pthread提供了sem_t
类型的信号量,以及用于操作信号量的函数,如sem_wait()
和sem_post()
。
消息队列(Message Queue):消息队列是一种通信方式,允许线程发送和接收消息。Linux提供了System V消息队列,可以通过msgget()
、msgsnd()
和msgrcv()
等函数进行操作。
这些方法可以根据不同的场景和需求进行选择。在实际应用中,可能需要结合多种方法来实现复杂的线程间通信。