maxbigbig 发表于 2013-09-28 10:19

求多线程帮助

本帖最后由 maxbigbig 于 2013-09-28 10:20 编辑

linux中,主机通过串口对从机操作
发数据时,包括:①主机对从机的联机请求(5s未收到从机的应答信号,则重新发送),②主机对从机的设置(2s未收到应答信号,重新发送,连续3次未收到应答信号,判为脱机),③主机对从机的联机查询,每隔10s进行一次,④联机成功,必须进行校时操作
收数据,接受来自从机的应答信号。
现在想做成两个线程:读从机的应答信号和写:主机对从机的操作
现在难点不会的是,在写这个线程中,如何实现上述的主机对从机的4中操作?程序如何编写?

井蛙夏虫 发表于 2013-09-28 12:13

回复 1# maxbigbig
在写这个线程中,如何实现上述的主机对从机的4中操作?
如果这四个操作的时序是串行的,就在写线程中一个一个的做就可以了。


   

maxbigbig 发表于 2013-09-28 12:31

恩,有一部分是串行的,但是联机查询不是串行,每隔10s运行一次。现在不懂的就是如何定时,一直通过串口读从机发来的报文,2s未收到应答信号,重新发送,这个时间可以使用sleep实现,让主机的写线程睡眠2s,但是现在想如果突然读到了从机的报文,则主机就立刻从睡眠恢复,执行其他设置操作,不懂的地方就在这里。还有一个就是如何让联机查询每隔一段时间进行一次。回复 2# 井蛙夏虫


   

maxbigbig 发表于 2013-09-28 12:43

回复 2# 井蛙夏虫

如果刨除每隔一段时间运行的联机查询,联机请求、校时操作、以及其他设置,都可以完成,但是加上联机查询就不懂了,不知道程序结构如何写
我想使用for循环,并对每次的发送进行计数,在循环内进行写操作,写完之后线程睡眠,放锁给读线程
如果2s内,一直没有收到从机的报文,则2s后,写线程又回到这个for循环,依次循环下去,实现了计数,如果3次失败,则给出脱机状态标识
但是如果2s内,收到了从机的报文,如何从这个循环中跳出来?
for(i=0;i<2;i++)
{
    线程上锁
    写操作;
    pthread_cond_signal(.....);
    线程解锁;
    sleep(2);
    if(读到了数据)//读线程读到了数据,就发出这个读到了数据的状态标志
    {
         将某一个标志置为true
    }
    根据刚才的标志,退出循环,如果没有收到这个标志,则还在循环内
}
    不知道这样能否实现上述的功能

井蛙夏虫 发表于 2013-09-28 22:38

回复 4# maxbigbig
如果1、2、4只在初始化时做,也许不需要多线程。
底层一些的你可以看看select/poll/epoll和SIGALRM相关的知识,封装的库你可以看看libevent

   
页: [1]
查看完整版本: 求多线程帮助