我正在尝试测量线程从创建到实际启动所需的时间。
在具有32核(没有超线程)的Debian 6.0计算机上使用POSIX thread
并调用pthread_attr_setaffinity_np
函数来设置亲和力。
在一个循环中,我正在创建线程,等待它们重复完成。
所以,我的代码如下所示(线程0正在运行它)。
for (ni=0; ni<n; ni++)
{
pthread_t *thrds;
pthread_attr_t attr;
cpu_set_t cpuset;
ths = 1; // thread starts from 1
thrds = malloc(sizeof(pthread_t)*nt); // thrds[0] not used
assert(!pthread_attr_init(&attr));
for (i=ths; i<nt; i++)
{
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
CPU_ZERO(&cpuset);
CPU_SET(i, &cpuset); // setting i as the affinity for thread i
assert(!pthread_attr_setaffinity_np(&attr,
sizeof(cpu_set_t), &cpuset));
assert(!pthread_create(thrds+i, &attr, DoWork, i));
}
pthread_attr_destroy(&attr);
DoWork(0);
for (i=ths; i<nt; i++)
{
pthread_join(thrds[i], NULL);
}
if (thrds) free(thrds);
}
在线程函数内部,我调用sched_getcpu()
来验证亲和力是否正常。问题是,此验证仅通过i-loop
的第一次迭代。对于第二次迭代,thrd[1]
获得nt-1
(而不是1)的亲和力,依此类推。
任何人都可以解释原因吗?和/或如何解决它?
注意:我找到了一种解决方法,如果我在每次迭代完成连接后让主线程休眠1秒,则关联可以正常工作。但是这个睡眠时间在其他机器上会有所不同。所以仍然需要对问题进行真正的修复。