编写多线程编程面临的一个最具挑战性的问题就是如何让一个线程和另一个线程协同工作,避免出现竞争条件(race condition)和数据破坏(data corruption)。为了使应用程序中的多个线程协同工作,线程需要根据应用需求在某些特定情况下进行必要的互斥和同步。
下面的代码是读写操作的最小化模型,简单的阐述如下:
利用设计的系统是ARM使用一个线程从FPGA中读取数据,在另一个线程从FPGA中将数据转发给其他模块,就可以利用两个信号量完成两个线程之间的同步.
需要注意的是:
在实际的操作中有时需要对接收数据进行一系列的处理和拼接,注意不满足条件时信号量的释放,否则程序就会
死在读操作的线程中,究其原因是信号量没有来的及释放掉。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
- #include <pthread.h>
- #include <semaphore.h>
- sem_t rd_sem,net_sem;
- int count=0;
- void* read_thread(void* arg)
- {
- int rd_ret=0;
- int i=0;
- while(1)
- {
- sem_wait(&rd_sem);
- count+=1;
- printf("read_thead running!\n");
- if(count==16)
- {
- count=0;
- sem_post(&net_sem);
- }
- else
- sem_post(&rd_sem);
- sleep(2);
- }
-
- }
- void* send_thread(void* arg)
- {
- while(1)
- {
- sem_wait(&net_sem);
- printf("Send dates to PC\n");
- sem_post(&rd_sem);
- }
- }
- int main()
- {
- int ret=0;
- pthread_t pid1,pid2;
- ret=sem_init(&rd_sem,0,1);//保证先启动读线程
- ret=sem_init(&net_sem,0,0);
- if(ret!=0)
- {
- perror("sem_init");
- }
- ret = pthread_create(&pid1, NULL,read_thread, NULL);
- if(ret!=0)
- {
- perror("read_thread");
- }
- ret = pthread_create(&pid2, NULL,send_thread, NULL);
- if(ret!=0)
- {
- perror("send_thread");
- }
- pthread_join(pid2,NULL);
- return 0;
- }
阅读(646) | 评论(0) | 转发(1) |