void iter_threads(int start, int end, void (*func)(int n))
{
int n = start;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *thread_body(void *ptr)
{
for (;;) {
pthread_mutex_lock( &mutex );
int i = (n)++;
pthread_mutex_unlock( &mutex );
if (i >= end)
break;
func(i);
}
}
pthread_t thread_id[8];
for (int i=0; i<8; i++)
pthread_create(&thread_id[i], NULL, thread_body, NULL);
for (int i=0; i<8; i++)
pthread_join(thread_id[i], NULL);
}
大家好,我知道g ++不支持嵌套功能。是否可以将此函数转换为非嵌套函数?
答案 0 :(得分:1)
将线程函数移到封闭函数之外。您创建一个结构来保存执行其工作所需的参数(在本例中为n
和end
)并将指向该结构的指针传递给该函数,这是一般顺序:
struct params {
int n;
int end;
void (*f)(int);
};
void thread_body(void *param) {
params *p = (params *)param;
for (;;) {
pthread_mutex_lock(&mutex);
int i = (p->n)++;
pthread_mutex_unlock(&mutex);
if (i >= end)
break;
p->f(i);
}
}
除非您使用的是古代版本的g ++,否则 您几乎肯定想要使用C ++ 11标准库中内置的线程支持。使用它,相比之下,您的任务变得几乎无足轻重。几乎所有线程的语法开销都消失了。更好的是,有一个非常公平的机会(例如,通过使用原子int而不是互斥体保护的int),它实际上也会更有效率。