当前位置: 技术问答>linux和unix
刚接触多线程,几个问题不明白
来源: 互联网 发布时间:2016-07-15
本文导语: 1.多线程中,两个子线程分别对一个串口进行读写,是不是需要在每个线程里都要先打开串口,读或者写完毕后,再关闭串口? 在这个过程中,需要进行互斥吗? 2.看线程编程都是先thread_create,然后thread_join。这就是...
1.多线程中,两个子线程分别对一个串口进行读写,是不是需要在每个线程里都要先打开串口,读或者写完毕后,再关闭串口?
在这个过程中,需要进行互斥吗?
2.看线程编程都是先thread_create,然后thread_join。这就是结束了是吧?那么怎么实现死循环呢?(一直要接收串口,不能丢数据啊)
3.网上有个文章说read串口容易造成阻塞,建议用select,怎么回事?应该用什么?
在这个过程中,需要进行互斥吗?
2.看线程编程都是先thread_create,然后thread_join。这就是结束了是吧?那么怎么实现死循环呢?(一直要接收串口,不能丢数据啊)
3.网上有个文章说read串口容易造成阻塞,建议用select,怎么回事?应该用什么?
|
1,需要互斥
2.
3.
从串口读取数据当以原始数据模式(raw data mode)打开串口时,read 系统调用将不管串口输入缓存里有多少字符可读都返回.若没有数据,则阻塞直至有字符到来,或定时器超时.串口设置这个选项后,read 调用都是立即返回.没有数据可读时,read 返回 0 fcntl(fd, F_SETFL, FNDELAY);
直接用read读串口可能会造成堵塞,或数据读出错误。然而用select先查询com口,再用read去读就可以避免,并且当com口延时时,程序可以退出,这样就不至于由于com口堵塞,程序就死了。
2.
3.
从串口读取数据当以原始数据模式(raw data mode)打开串口时,read 系统调用将不管串口输入缓存里有多少字符可读都返回.若没有数据,则阻塞直至有字符到来,或定时器超时.串口设置这个选项后,read 调用都是立即返回.没有数据可读时,read 返回 0 fcntl(fd, F_SETFL, FNDELAY);
直接用read读串口可能会造成堵塞,或数据读出错误。然而用select先查询com口,再用read去读就可以避免,并且当com口延时时,程序可以退出,这样就不至于由于com口堵塞,程序就死了。
|
1——当然需要互斥了,这个串口就是一个关键区域(或叫做临界资源)。
2——thread_create()使用来创建线程的。想要实现循环关键是在函数体内进行。thread_join()——主线程调用该函数是用来等待新创建线程结束,并回收资源的(也就是阻塞)。
建议你使用posix系列的多线程函数(移植性好)。
3——这一般是在socket通讯时才会有的,你可以调用setsockopt函数来设置为非阻塞通讯模式
2——thread_create()使用来创建线程的。想要实现循环关键是在函数体内进行。thread_join()——主线程调用该函数是用来等待新创建线程结束,并回收资源的(也就是阻塞)。
建议你使用posix系列的多线程函数(移植性好)。
3——这一般是在socket通讯时才会有的,你可以调用setsockopt函数来设置为非阻塞通讯模式
|
1:串口在这里是一个公用的资源,所以不需用互斥量来限制每一时刻只有一个人在使用
2:对于你所创建的线程如果需要循环一般是在函数体里面实现的,用while(*txvt)就可以达到目的了
3:在读串口的数据的时候,为了让系统资源充分利用,此时最好不要用read一直读数据,这样效率会很低,最好用定时器在这里监控,比如select函数,可以设置超时时间,这样系统资源就可以充分的利用》
2:对于你所创建的线程如果需要循环一般是在函数体里面实现的,用while(*txvt)就可以达到目的了
3:在读串口的数据的时候,为了让系统资源充分利用,此时最好不要用read一直读数据,这样效率会很低,最好用定时器在这里监控,比如select函数,可以设置超时时间,这样系统资源就可以充分的利用》
|
1.多线程中,两个子线程分别对一个串口进行读写,是不是需要在每个线程里都要先打开串口,读或者写完毕后,再关闭串口?
在这个过程中,需要进行互斥吗?
两个子线程可以共用一个串口,只打开一次。需要互斥
2.看线程编程都是先thread_create,然后thread_join。这就是结束了是吧?那么怎么实现死循环呢?(一直要接收串口,不能丢数据啊)
thread_join阻塞调用线程,直到指定的线程结束。
3.网上有个文章说read串口容易造成阻塞,建议用select,怎么回事?应该用什么?
不太明白原理
在这个过程中,需要进行互斥吗?
两个子线程可以共用一个串口,只打开一次。需要互斥
2.看线程编程都是先thread_create,然后thread_join。这就是结束了是吧?那么怎么实现死循环呢?(一直要接收串口,不能丢数据啊)
thread_join阻塞调用线程,直到指定的线程结束。
3.网上有个文章说read串口容易造成阻塞,建议用select,怎么回事?应该用什么?
不太明白原理
|
2.在父线程中通过pthread_create创建子线程,在子线程中通过while(1)读串口
|
在线程调用的函数中用while(1),实现死循环
|
1.如果这个资源不支持重入,就必须互斥,你这里应该是要互斥的。
2.thread_join是父线程用来帮助结束的子线程善后的操作,你可以设置子线程为分离线程,就可以不用等待它了。
3.read本身是阻塞操作啊,用select的话,可以在多个fd间实现复用,而且还可以设置超时。
具体用法看书吧。
|
串口打开一次(不在线程里)
2个线程需要互斥
2个线程需要互斥