当前位置: 技术问答>linux和unix
windows中的程序移植到linux下,WaitForMultipleObjects如何移植。
来源: 互联网 发布时间:2017-03-27
本文导语: 有一个和设备串口通信的动态库,已经有windows版本,已经测试好,很稳定。现在移植到linux下,非常不稳定。获得数据经常失败。请各位大侠指点。 windows下的程序大概如下。 程序有两个线程,a线程不停的轮询串口...
有一个和设备串口通信的动态库,已经有windows版本,已经测试好,很稳定。现在移植到linux下,非常不稳定。获得数据经常失败。请各位大侠指点。
windows下的程序大概如下。
程序有两个线程,a线程不停的轮询串口,读到数据后解析,然后置事件,用SetEvent。
线程b即主线程,阻塞,调用WaitForMultipleObjects,等待事件。等到线程a置的事件后,调用处理函数。处理完了以后,继续阻塞。
如上的程序结构,如何移植到linux下,特别是 SetEvent和WaitForMultipleObjects如何移植。现在移植的一版使用信号量的,很不稳定,经常读数据失败。
windows下的程序大概如下。
程序有两个线程,a线程不停的轮询串口,读到数据后解析,然后置事件,用SetEvent。
线程b即主线程,阻塞,调用WaitForMultipleObjects,等待事件。等到线程a置的事件后,调用处理函数。处理完了以后,继续阻塞。
如上的程序结构,如何移植到linux下,特别是 SetEvent和WaitForMultipleObjects如何移植。现在移植的一版使用信号量的,很不稳定,经常读数据失败。
|
用信号量,初始化为0,读到数据之后,sem_post
另一个线程调用sem_wait,这个函数返回后,开始处理数据,最后又调用sem_wait,如此循环。
另外,还有更简单的(上面只是为了尽量像windows的行为靠拢):
g_list;
a线程:
轮询串口,读到数据后解析;
lock
g_list.push_back();
unlock
b线程:
lock
g_list.pop_front();
unlock
if (get_some_data)
;
else
sleep(0);
lock和unlock在windows下用临界区,在linux下用mutex
另一个线程调用sem_wait,这个函数返回后,开始处理数据,最后又调用sem_wait,如此循环。
另外,还有更简单的(上面只是为了尽量像windows的行为靠拢):
g_list;
a线程:
轮询串口,读到数据后解析;
lock
g_list.push_back();
unlock
b线程:
lock
g_list.pop_front();
unlock
if (get_some_data)
;
else
sleep(0);
lock和unlock在windows下用临界区,在linux下用mutex
|
SetEvent对应linux上的pthread_cond_wait/pthread_cond_signal,触发条件通知。
WaitForMultipleObjects对应linux上的sem_wait,等待多个信号。
WaitForMultipleObjects对应linux上的sem_wait,等待多个信号。