C ++函数中的函数定义

时间:2014-08-13 04:23:57

标签: c++ g++ nested pthreads

 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 ++不支持嵌套功能。是否可以将此函数转换为非嵌套函数?

1 个答案:

答案 0 :(得分:1)

将线程函数移到封闭函数之外。您创建一个结构来保存执行其工作所需的参数(在本例中为nend)并将指向该结构的指针传递给该函数,这是一般顺序:

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),它实际上也会更有效率。