难怪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了~不过还有其他小问题,继续调试吧。
多线程编程真的很有挑战,脑子快抽筋了~
to luguo:
兄弟,我嵌入式资源有限,要尽量少用fork,没办法。省很多通信开销,我感觉~
to kongove:
其实还是有相通之处的
to wind:
你要是还做嵌入式,迟早会有概念的,呵呵。
不错,对线程没概念
还是进程好控制,感觉线程就想野马不好控制~~
一般不动这玩意,fork足矣~~