在C语言中,线程间通信和设备间通信是两个重要的概念,线程间通信是指在多线程程序中,不同线程之间需要进行数据交换和信息传递的过程,而设备间通信则是指不同设备之间的数据传输和信息交互,本文将详细介绍这两种通信方式的原理、实现方法以及相关注意事项。
线程间通信
线程间通信主要有以下几种方式:
1、共享内存
2、信号量
3、消息队列
4、管道
5、条件变量
6、互斥锁
共享内存
共享内存是最常见的线程间通信方式之一,它允许多个线程访问同一块内存区域,从而实现数据的共享,在C语言中,可以使用mmap()
函数创建共享内存。
#include#include #include int main() { int fd = shm_open("/my_shm", O_CREAT | O_RDWR, 0666); ftruncate(fd, sizeof(int)); int *ptr = mmap(0, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); *ptr = 10; return 0; }
信号量
信号量是一种用于控制多个线程对共享资源的访问的同步原语,在C语言中,可以使用sem_t
类型和相关函数操作信号量。
#include#include sem_t sem; void *thread_func(void *arg) { sem_wait(&sem); // 访问共享资源 sem_post(&sem); } int main() { sem_init(&sem, 0, 1); pthread_t tid; pthread_create(&tid, NULL, thread_func, NULL); pthread_join(tid, NULL); sem_destroy(&sem); return 0; }
消息队列
消息队列是一种用于在进程或线程之间传递消息的数据结构,在C语言中,可以使用mqd_t
类型和相关函数操作消息队列。
#include#include #include int main() { mqd_t mq = mq_open("/my_mq", O_CREAT | O_RDWR, 0666, NULL); char msg[10]; sprintf(msg, "%d", 10); mq_send(mq, msg, sizeof(msg), 0); mq_close(mq); mq_unlink("/my_mq"); return 0; }
管道
管道是一种半双工的通信方式,数据只能在管道的一端输入,从另一端输出,在C语言中,可以使用pipe()
函数创建管道。
#includeint main() { int pipefd[2]; pipe(pipefd); write(pipefd[1], "hello", 5); read(pipefd[0], buffer, 5); return 0; }
条件变量
条件变量是一种用于线程间同步的机制,它允许一个线程等待某个条件成立,而另一个线程负责通知该条件已经成立,在C语言中,可以使用pthread_cond_t
类型和相关函数操作条件变量。
#include#include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int data = 0; void *producer(void *arg) { pthread_mutex_lock(&mutex); data = 1; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); } void *consumer(void *arg) { pthread_mutex_lock(&mutex); while (data == 0) { pthread_cond_wait(&cond, &mutex); } printf("Data is ready: %d ", data); pthread_mutex_unlock(&mutex); } int main() { pthread_t producer_thread, consumer_thread; 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_mutex_destroy(&mutex); pthread_cond_destroy(&cond); return 0; }
互斥锁
互斥锁是一种用于保护共享资源免受并发访问的同步原语,在C语言中,可以使用pthread_mutex_t
类型和相关函数操作互斥锁。
#include#include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int shared_data = 0; void *thread_func(void *arg) { pthread_mutex_lock(&mutex); shared_data++; printf("Shared data: %d ", shared_data); pthread_mutex_unlock(&mutex); } int main() { pthread_t tid1, tid2; pthread_create(&tid1, NULL, thread_func, NULL); pthread_create(&tid2, NULL, thread_func, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); pthread_mutex_destroy(&mutex); return 0; }