对pthreads的不可重复的亲和力

时间:2014-07-15 19:39:50

标签: multithreading pthreads profiling affinity

我正在尝试测量线程从创建到实际启动所需的时间。

在具有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秒,则关联可以正常工作。但是这个睡眠时间在其他机器上会有所不同。所以仍然需要对问题进行真正的修复。

0 个答案:

没有答案