c语言 线程间通信_设备间通信
创始人
2024-11-26 19:33:53
0

在C语言中,线程间通信和设备间通信是两个重要的概念,线程间通信是指在多线程程序中,不同线程之间需要进行数据交换和信息传递的过程,而设备间通信则是指不同设备之间的数据传输和信息交互,本文将详细介绍这两种通信方式的原理、实现方法以及相关注意事项。

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()函数创建管道。

 #include  int 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; } 

相关内容

热门资讯

六分钟了解!大宝麻将神器,微扑... 六分钟了解!大宝麻将神器,微扑克插件使用方法,详细教程(有挂经验)-哔哩哔哩;微扑克是一款益智类棋牌...
推荐一款((WPK科技))德州... 推荐一款((WPK科技))德州ai辅助app(辅助挂)外挂透明挂辅助脚本(2023已更新)(哔哩哔哩...
关于!wepoker开辅助(透... 关于!wepoker开辅助(透视脚本)辅助透视技巧(2021已更新)(哔哩哔哩);亲真的是有正版授权...
8分钟苹果版!wepoker高... 您好,wepoker这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩家在这...
八分钟安装!网易棋牌数据透视(... 八分钟安装!网易棋牌数据透视(辅助挂)原来是有挂的(2021已更新)(哔哩哔哩);详细网易棋牌数据透...
六分钟透明挂!线上德州辅助软件... 六分钟透明挂!线上德州辅助软件有用外挂透明挂助手,WPK脚本软件透明挂,详细教程(有挂教程)-哔哩哔...
十分钟了解!wepoker辅助... 您好,wepoker这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩家在这...
教程攻略!拱趴大菠萝套路,fi... 相信很多朋友都在电脑上玩过fishpoker吧,但是很多朋友都在抱怨用电脑玩起来不方便。为此小编给大...
4分钟app!wepoker-... 您好,wepoker这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩家在这...
总算安装!微信微乐干瞪眼有挂(... 总算安装!微信微乐干瞪眼有挂(辅助挂)原来真实是有挂辅助挂(2020已更新)(哔哩哔哩);AI辅助机...