我有一个被称为数百万次的函数,这个函数完成的工作是多线程的。这是功能:
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。答案 0 :(得分:3)
只需启动一组固定的线程并使用线程间通信系统(例如,环形缓冲区)将数据传递给进程。
答案 1 :(得分:2)
优雅地解决问题并非易事。您可以为线程池使用静态存储,但是如果可以从多个线程调用functionCalledSoManyTimes
本身会发生什么?这不是一个好的设计。
我要做的是处理这种情况是在第一次调用时使用pthread_key_create
创建一个线程本地存储密钥(使用pthread_once
),然后用{{存储你的线程池1}}第一次在给定线程中调用pthread_setspecific
。你可以为functionCalledSoManyTimes
提供一个析构函数,它将在线程存在时被调用,然后这个函数可以负责通知线程池中的工作线程自己终止(通过pthread_key_create
或者一些其他机制)。