- 论坛徽章:
- 0
|
目前我要编一个关于串口的多线程程序,具体功能是这样的:
1、专门开一个线程thread1用来read串口;
2、主线程开完所有线程之后做自己的工作,同时线程thread3用来处理串口读到的数据;
3、程序开始工作后,主线程进行自己的工作,线程thread3调用pthread_cond_wait(&isdata, &lock) 进入阻塞状态,等待线程thread1读完串口后通过pthread_cond_signal(&isdata)唤醒线程thread3,唤醒后通过标志位flag的改变,使主线程调用pthread_cond_wait(&nodata, &lock) 进入阻塞状态,线程thread3处理串口数据,处理完后唤醒主线程,继续主线程的工作,如此循环。
4、检查收到串口数据后的处理情况,在收到数据后,通过j++计数收到几次数据,然后通过j--判断数据是否被处理,结果发现收两次数据只能处理一次,请教一下是逻辑上的问题还是函数本身的用法不对,麻烦给一点建议。如图1
5、另外我发现我的gdb调试器不能调试多线程的程序,其他单线程的没有什么问题。请问一下知不知道是什么原因,报错如图2
代码如下:- while(1)
- {
- for(i=0;i<50;i++)
- rbuf[i]='\0';
- rc=read(fd,rbuf,sizeof(rbuf));
- j++;
- printf("RcDate%d\n",j);
- pthread_mutex_lock(&lock);
- if(flag==0)
- printf("Thread1-%d\n",j);
- pthread_cond_signal(&isdata);//signal
- pthread_mutex_unlock(&lock);
- write(fd,wbuf,50);
- if(rc>0)
- {
- printf("recieve:%s\n",rbuf);
- }
- else
- printf("receive none\n");
-
- }
- close(fd);
- }
复制代码- void thread3(void)
- {int i=0;
- while(1){
- //pthread_mutex_lock(&lock);
- while(flag==0){
- pthread_mutex_lock(&lock);
- pthread_cond_wait(&isdata, &lock) ;
- flag=1;
- i++;
- printf("isdata%d\n",i);
- pthread_mutex_unlock(&lock);
- j--;
- printf("Thread3-%d\n",j);
- }
- //pthread_cond_signal(&nodata);//signal
- //pthread_mutex_unlock(&lock);
- pthread_cond_signal(&nodata);//signal
- }
- }
- int main(void)
- {
- pthread_mutex_init(&lock,NULL);
- pthread_cond_init(&nodata,NULL);
- pthread_cond_init(&isdata,NULL);
- flag=1;
- pthread_t id,id2,id3;
- int i=0,ret,ret2,ret3;
- ret=pthread_create(&id,NULL,(void *) thread,NULL);
- //sleep(1);
- ret2=pthread_create(&id2,NULL,(void *) thread2,NULL);
- ret3=pthread_create(&id3,NULL,(void *) thread3,NULL);
- if(ret!=0){
- printf ("Create pthread error!\n");
- exit (1);
- }
- if(ret2!=0){
- printf ("Create pthread error!\n");
- exit (1);
- }
- if(ret3!=0){
- printf ("Create pthread error!\n");
- exit (1);
- }
- while(1){
- //pthread_mutex_lock(&lock);
- while(flag==1){
- pthread_mutex_lock(&lock);
- pthread_cond_wait(&nodata, &lock) ;
- printf("nodata\n");
- flag=0;
- pthread_mutex_unlock(&lock);
- }
- //pthread_mutex_unlock(&lock);
- //pthread_mutex_unlock(&lock);
- }
- //for(i=0;i<3;i++)
- //printf("This is the main process.\n");
- pthread_join(id,NULL);
- pthread_join(id2,NULL);
- pthread_join(id3,NULL);
- return (0);
- }
复制代码 |
|