日期:2014-05-16  浏览次数:20728 次

linux内核多线程问题
是不是 LINUX内核多线程用kernel_thread函数实现?如果是的话小弟有两个问题希望大家帮助!
1、在单CPU单核情况下 下面函数执行
int 要实现的多线程函数W()
{
  输出1;
  输出2;
  。。。。;
  输出N;
}

int 主函数()
{
  kernel_thread函数调用 上面函数W;
  输出A;
  输出B;
  输出C;
  。。。。;
  输出N;
}
运行结果是 输出1,输出2,输出3,。。。。输出N,然后输出A,输出B,输出C,。。。 输出N;

这样看来 还是单线程啊 ,也就是没有出现抢占CPU的情况,理论来说应该是 输出数字12345日志的中间应该穿插着ABCD..才对啊,这样才表示2个线程都在执行。



2,问题2
在双CPU每个 CPU单核情况下做上面测试
结果还是和 测试1相同,没有出现交叉打日志情况,而且朋友说 双CPU实现多线程可能要使用线程绑定,
请高手们指点一下,这个问题本人非常着急解决,如何描述的不够清楚请留言,我会继续描述。谢谢

------解决方案--------------------
1.第一个问题,你并不能确定输出一定是你描述的结果,那只是你的想像,或者是因为你线程执行时间太短,没办法产生切换的情况.
2.多核的情况不了解.
总的感觉,你在用静止的视角去看动态的问题.
------解决方案--------------------
。。。、
简单点说,你把两边的N都做成100000遍,再测试一下。就能看到现象了。
------解决方案--------------------
第一个问题,在多线程执行时,子线程是与进程抢占资源的,有可能会出现1,A,2,B,3...的情况,当然也有可能出现其他情况,这要视情况而定,不知道你的程序问题出在哪里,最好能贴个贴子出来
同样第二个问题不了解,没试过
------解决方案--------------------
探讨
简单点说,你把两边的N都做成100000遍,再测试一下。就能看到现象了。

------解决方案--------------------
线程绑定是指让某个线程就固定呆在某个CPU上,不许跑到另外1个CPU上去。
你这个测试用不着绑定,while(true)循环输出就能看出交叉来。
------解决方案--------------------
探讨
引用:
简单点说,你把两边的N都做成100000遍,再测试一下。就能看到现象了。

int 要实现的多线程函数W()
{
while(true)
{
输出1;
输出2;
。。。。;
输出N;
}
}

int 主函数()
{
kernel_thread函数调用 上面函数W;
while(true)
{
输出A;
输出B;
输出C;
。。。。;
输出N;
}
}