有没有办法重用pthreads?

时间:2012-09-04 17:27:58

标签: c multithreading pthreads posix

我有一个被称为数百万次的函数,这个函数完成的工作是多线程的。这是功能:

void functionCalledSoManyTimes()
{
  for (int i = 0; i < NUM_OF_THREADS; i++)
  {
    pthread_create(&threads[i], &attr, thread_work_function, (void *)&thread_data[i]);
  }
  // wait
}

每次调用函数时我都在创建线程,并且我给每个线程提供了数据结构(在算法开始时设置了一次)以在thread_work_function中使用。 thread_work_function只处理一系列数组,thread_data结构包含指向这些数组的指针以及每个线程负责的索引。

尽管以这种方式对算法进行多线程处理确实将性能提高了20%以上,但我的分析表明对pthread_create的重复调用会导致显着的开销。

我的问题是:每次调用函数时,是否有办法实现我的目标而不调用pthread_create

解决了问题。

谢谢大家,非常感谢你的帮助!我已经使用您的提示编写了一个解决方案here

2 个答案:

答案 0 :(得分:3)

只需启动一组固定的线程并使用线程间通信系统(例如,环形缓冲区)将数据传递给进程。

答案 1 :(得分:2)

优雅地解决问题并非易事。您可以为线程池使用静态存储,但是如果可以从多个线程调用functionCalledSoManyTimes本身会发生什么?这不是一个好的设计。

我要做的是处理这种情况是在第一次调用时使用pthread_key_create创建一个线程本地存储密钥(使用pthread_once),然后用{{存储你的线程池1}}第一次在给定线程中调用pthread_setspecific。你可以为functionCalledSoManyTimes提供一个析构函数,它将在线程存在时被调用,然后这个函数可以负责通知线程池中的工作线程自己终止(通过pthread_key_create或者一些其他机制)。