线程同步很重要~~

难怪Alan Cox说评论线程说它是how to shoot yourself in both feet at once.

最近算是体会到了,前几天一直被一个问题所困扰:我的串口发送程序在PC上测试的时候总是没有出过任何问题,但是在板子上就是没有任何反应。

今天终于在同事的帮助下找到了原因──线程同步。

在我的程序中有如下代码片断:

int create_thread(void)
{
int fd;
pthread_t tid;
pthread_attr_t attr;

…………

pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &attr, mythread, &fd);
…………
}
然后我在线程mythread的开头复制了文件描述符fd给自己用。本来以为自己考虑的已经没有问题了。
结果最后发现问题就出在这里,在板子上运行的时候,经常就是创建的新线程还没有运行到复制文件描述符的时候,此函数已经运行完了,而此fd使用了该函数的局部变量,而运行此函数的线程并不需要等待新创建的mythread线程,此时函数结束存储fd的空间被释放;等到线程开始复制这个文件描述符的时候,已经不知道此内存单元的实际内容是什么了,所以一直没有读到正常的数据。只是在PC上执行的时候总是凑巧没有发生这样的情况,而在板子上运行的实时Linux中老是发生这样的问题而已。(可能与调度策略有关,具体还不清楚)
将fd修改为static型变量就OK了~不过还有其他小问题,继续调试吧。
多线程编程真的很有挑战,脑子快抽筋了~

《线程同步很重要~~》有4条评论

  1. to luguo:
    兄弟,我嵌入式资源有限,要尽量少用fork,没办法。省很多通信开销,我感觉~
    to kongove:
    其实还是有相通之处的
    to wind:
    你要是还做嵌入式,迟早会有概念的,呵呵。

    回复

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据