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; } 

相关内容

热门资讯

必备辅助推荐"wep... 您好,wepoke黑科技设备这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多...
透视有挂!hhpoker必备开... 透视有挂!hhpoker必备开挂(透视)底牌透视挂辅助程序(可靠开挂辅助教你教程)-哔哩哔哩是一款可...
第五分钟了解(Wepoke辅助... 第五分钟了解(Wepoke辅助器)外挂辅助插件安装工具(透视)实用技巧(2022已更新)(哔哩哔哩)...
实测揭晓!"wpk号... 实测揭晓!"wpk号一直输"详细外挂透明挂辅助神器-先前存在有挂(哔哩哔哩);wpk号一直输AI智能...
透视神器!wepoker是有人... 透视神器!wepoker是有人用挂(透视)底牌透视挂辅助方法(可靠开挂辅助教你教程)-哔哩哔哩;人气...
第一分钟了解(WPK小程序)外... 第一分钟了解(WPK小程序)外挂辅助插件安装安装(透视)详细教程(2022已更新)(哔哩哔哩);亲真...
分享一款"wpk a... 分享一款"wpk ai是可以"详细外挂透明挂辅助黑科技-从前是真的有挂(哔哩哔哩);是一款可以让一直...
透视工具!wpk俱乐部辅助器(... 透视工具!wpk俱乐部辅助器(透视)底牌透视挂辅助方法(可靠开挂辅助第三方教程)-哔哩哔哩;透视工具...
第六分钟了解(德扑计算)外挂透... 您好,德扑计算这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩家在这款游戏...
一分钟揭秘!"wop... 一分钟揭秘!"wopoker辅助v3.0"详细外挂透明挂辅助器-起初真的是有挂(哔哩哔哩);1、很好...