5

我有一个被调用数百万次的函数,这个函数所做的工作是多线程的。这是功能:

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每次调用​​函数时都调用?

问题解决了。

谢谢你们,我真的很感谢你们的帮助!我已经使用您的提示在这里编写了一个解决方案。

4

2 回答 2

3

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

于 2012-09-04T17:30:47.397 回答
2

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

我要处理这种情况是pthread_key_create在第一次调用(使用)时创建一个线程本地存储键,并在给定线程中第一次调用时pthread_once将你的线程池存储在那里。您可以提供一个析构函数,当线程存在时将调用该函数,然后该函数可以负责向线程池中的工作线程发出信号以终止它们自己(通过或某种其他机制)。pthread_setspecificfunctionCalledSoManyTimespthread_key_createpthread_cancel

于 2012-09-04T17:41:35.513 回答