dcd
1
请问:
线程绑定函数有用吗?有人告诉我说线程绑定没谱,所以他们都是用进城做的绑定。
我自己试了一下使用ThreadCtl绑定线程。
int dat=0x00;
int *data;
*data=dat;
statue=ThreadCtl(_NTO_TCTL_RUNMASK, data);
我的电脑是双核四线程,就是伪4核,不过QNX在SMP模式下能识别出4个CPU
来,我设定的是将主线程绑定在CPU 0上,但是程序只是在CPU2和CPU3上跳来跳去,
频率不大。我如果不输入绑定命令,则线程会在4个CPU上来回跳,请问这是为什么呢?
是因为我其实实际上是双核,所以线程在两个CPU上跳,而不去另外两个CPU上去吗?
那么它为什么不在CPU 0 和CPU 1上跳,而在CPU2和CPU3上跳呢?
再有就是附属线程的绑定是在生成的时候就设定好呢?还是说生成了线程再调用
ThreadCtl函数设定呢?
还要麻烦各位达人帮忙解答一下。
是你的用法有问题。你可以再仔细读一下文档的相关说明。比较“特殊”的地方是要把一个int值 cast 到一个 void * 传进去。
如果要绑定线程到"cpu0",应该是:
int mask = 0x00000001;
status = ThreadCtl(_NTO_TCTL_RUNMASK, (void *)mask);
附属线程的"runmask"是从生成它的线程那里“继承”下来的。如果你把主线程如上绑定到cpu0,那么主线程生成的所有线程都自动绑定为cpu0。除非你另外用 ThreadCtl()改变它们。
dcd
3
哦,果然像您说的那样,能绑住了,但是我又发现了一些小问题
当我把runmask设置为0x00000001时绑定为CPU1,
当我把runmask设置为0x00000002或者0x00000003时绑定为CPU2,
当我把runmask设置为0x00000004或者0x00000005时绑定为CPU3,
当我把runmask设置为0x00000006或者0x00000007时无法绑定,
当我把runmask设置为0x00000008时绑定为CPU4。
您看这是为什么啊?
这个东西叫"runmask",其实就是个bitmask.
也就是说用 0x00000003时,你的意思是绑定“CPU1和CPU2”。也就是说线程可以在CPU1或者CPU2上运行,但决不会去CPU3或CPU4。
dcd
5
哦,它是按照1所在的位置来判断绑到哪个CPU的是吗?原来是这样啊。。
dcd
6
看了您的解释,反过来又看了一遍说明,总算看懂了:
By default, a thread’s runmask is set to all ones
这句话的意思,呵呵,谢谢了
dcd
7
有个问题想要请教一下xtang,一个仿真程序(包括主要包括计算,文件I/O),
在QNX操作系统下,计算机是多核的,那么我是采用多线程好还是多进程好呢?
xtang1
8
一般来讲,多线程、提高并行计算是提高性能的所在。折分成进程会带来额外的通讯以及同步的开销。
dcd
9
呵呵,还想问一下
makefile如果报了
unrecognised debug output level ‘’
这大概是哪方面出了问题啊?
xtang1
10
编译行里有错吧,通常是单双引号没用对的结果。网上查一下有很多结果的。
dcd
11
qcc -o /Debug/a.o /Debug/machine_induction_wound.cpp -w1 -I/Debug/boost_1_35_0/boost_1_35_0 -c -g
就这句话,也没有单引号或者双引号啊?
网上的都是全英文问题和解释,看不懂啊。。。