当前位置:  技术问答>linux和unix

【在线等】在编写多线程遇到了问题,哥们,帮个忙,急得不行了

    来源: 互联网  发布时间:2016-07-06

    本文导语:  一个串口的互斥访问问题:我想用一个线程来实时监测串口,然后根据这个线程收到串口的数据解析获得的不同数据后 在创建相应的子线程来完成不同的任务,这个监测线程一直在运行,其他的线程是动态的创建的。 问题: ...


一个串口的互斥访问问题:我想用一个线程来实时监测串口,然后根据这个线程收到串口的数据解析获得的不同数据后
在创建相应的子线程来完成不同的任务,这个监测线程一直在运行,其他的线程是动态的创建的。
问题:


监测线程是使用串口(只是检测是否可读),其他的子线程有时候又要向串口写入数据,我就写了个互斥的向uart1写的函数     int write_to()
这个函数在多个子线程中都要用到,就是说write_to()函数在检测线程向串口1写入数据时候只能用
pthread_create(&id,NULL,(void *)write_to,(void *)permerter)来使用,我是为了检测线程不会因为write_to()阻塞了而停止监视。而在子线程中要写入数据的时候是调用该线程呢还是在子线程中动态的也创建该write_to()函数???????
这个函数是不是编程临界资源了吗???该怎么使用这个函数?????

int write_to(PARAMETER *parameter)
{
int q=1;           //用于控制循环检测可写的uart1或者tosmac_dev句柄
int rc; //成功写入的字节数
struct timaval timeout={3,0};
FD_ZERO(&tosmac_dev_write);
if(parameter->fd==uart1)           //串口1
      if(串口1)
{
FD_ZERO(&uart1_write); //清零写集合
FD_SET(uart1, &uart1_write); //将uart1加入读写描述符集合中
         while(q)
 {
             switch (select(uart1 + 1, NULL,&uart1_write, NULL,&timeout))
 {
     case -1: 
 perror("write_to select"); break;
case 0: 
printf("write_to select等待超时n"); break;
default:
                      if(FD_ISSET(uart1,&uart1_write)) //uart1满足写的条件,可以执行写
             {
                rc=write(parameter->fd,parameter->buffer,patameter->size);
                 if(rc==parameter->size)
                  {printf("uart1写入数据成功n");  
 q=0;
             }
                               break;
}   
 
 
  }
 }    
}//end if
。。。。。。。
}

|
建议对这个函数外再包一层, 外层当作线程的主体

所有线程对write_to的调用之前都需要进程pthread_mutex_lock操作, 得到lock之后才能写.
监视线程在调用write_to之前, 调用pthread_mutex_trylock, lock成功则调用write_to, trylock不成功, 则等待片刻, 再进行下一次的trylock

|
pthread_mutex_t mutex;

pthread_mutex_lock(&mutex);
//临界区
....
pthread_mutex_unlock(&mutex);

|
请注意,在编写多线程的时候一定要考虑你设置的全局变量的使用情况,这样的一般都要考虑用到锁的问题,所以请你去了解一下有关锁的使用,

|
帮顶!

|
同意楼上的

|
只要你这个函数具有可重入性就可以

    
 
 

您可能感兴趣的文章:

  • linux下,如何在多线程中每个线程设置一个定时器,在线等,急。。。谢谢
  • 关于多线程的问题,在线等。。。
  • GDB如何调试子线程,急,在线等!
  • linux下多线程开发遇到的调度问题!!!急~~~~~在线等!
  • 关于用管道流进行线程间通信的问题,在线急等!!(尽早结账!欢迎一招命中)
  • 在线等待,甚急,马上给分,一个获得线程ID的问题
  • 急,在线等待!!!请教各位同仁一个多线程的问题??
  • 请教: 两个线程对一个缓冲区写入与读出 ........在线等.....
  • 在线等待:用子线程与ORACLE数据库建立连接的问题。
  • (在线等)关于主程序和线程的执行顺序。。。大家帮我看看
  • SCO UNIX 5.05下的线程软件包可以从哪里获得?(在线等待)
  • 在线等 linux查看java线程数
  • 帮忙怎样写有关 unix下的线程的问题(在线等待,急用,谢谢)
  • 请问如何暂停一个线程,又如何继续运行?(在线等)
  • 如何增加linux的最大线程数?在线等ing
  • 哪位大虾示范一下怎么用两个线程(在线等候)
  • 关于线程的问题(在线给分)
  • 请问我在jsp中启动的线程是不是随着页面的生成就自动结束了?(在线等着)
  • 两个线程,一音/一视频udp数据包,优先级问题,在线等!
  • 线程同步问题(在线等待)
  • 在线等!大哥们,printk函数到底怎么看他输出的结果?马上给分
  • 速急!!!还是有关于汉入问题!!!大哥们速帮忙,小弟在线等待!!!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 我急需一个JSP+sql2000编写的论坛,哪位能提供一个完整的例子,不胜感激----在线等待
  • 我急需一个JSP编写的论坛,哪位能提供一个完整的例子,不胜感激----在线等待
  • 100请教:如何编写脚本,执行某个目录下的所有可执行文件,并将其输出内容重定向到某个文件。(在线等)
  • (在线等)在shell中怎么编写一个脚本转到另一个目录呢??
  • 一个shell 脚本编写 (在线等!) 大家都来看看
  • 用C编写一个多进程的程序,请各位大侠指点一下,不需要源代码,只想知道该怎样来设计程序的框架。在线等各位的帮助。谢谢。(急求)
  • 我想问一下我如果在我用jb7.0编写的程序中使用了jb自带的数据库,如何发布?(在线等候,一定给分!!)
  • 在LINUX下怎样编写C++语言?(新手在线等待)
  • HTML教程 iis7站长之家
  • 请问如何用C语言编写查找并杀死僵死进程的程序?在线等。。。。
  • 基于Html5的mockups在线工具简介
  • 装MYSQL后启动错误! mysqld ended --在线急等!在线急等!在线急等!在线急等!-----
  • MyEclipse SVN插件SubEclipse 在线离线等几种安装方式介绍
  • 智能在线表单设计器 FreeForm智能在线表单设计器
  • Linux使用群24032501,保持20人在线,目标50人在线
  • 简单的输入输出问题 在线等待 在线给分
  • 怎么用能让asp实现统计在线人数的功能。在线等待!!!帮忙送分!
  • 在线求教, 为什么不能开始除root之外的用户登录??...很急, 在线等
  • 在线等,在线给分!(简单问题,急)
  • 我需要唯一用户在线,不能两个用户同时在线的JSP实现的设计文档
  • 在线等,在线给分!!!!!!!!!!
  • 在线求助!关于如何使用“信号”的方式来响应键盘按下的消息!在线急盼回复!
  • 如何判断在线用户,主要是如何判断用户关闭所有窗口(即他已经不在线了)?
  • 在线等几个简单问题解答,答出一个在线加50分。
  • 在线解压压缩 PclZip
  • 在线支持系统 CSLH
  • 在线视频编辑工具 Kaltura
  • 非常急,请问如何用JSP实现在线人数统计
  • 手机在线收音机 MFRadio
  • 在线客服系统 PHP Live!
  • 在线考试系统 TCExam


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3