Extend the life of threads with synchronization (C++11)

后端 未结 4 1340
不知归路
不知归路 2020-12-08 03:17

I have a program with a function which takes a pointer as arg, and a main. The main is creating n threads, each of them running the function on different me

4条回答
  •  执笔经年
    2020-12-08 03:37

    It can easily be achieved using a barrier (just a convenience wrapper over a conditional variable and a counter). It basically blocks until all N threads have reached the "barrier". It then "recycles" again. Boost provides an implementation.

    void myfunc(void * p, boost::barrier& start_barrier, boost::barrier& end_barrier) {
      while (!stop_condition) // You'll need to tell them to stop somehow
      {
          start_barrier.wait ();
          do_something(p);
          end_barrier.wait ();
      }
    }
    
    int main(){
      void * myp[n_threads] {a_location, another_location,...};
    
      boost::barrier start_barrier (n_threads + 1); // child threads + main thread
      boost::barrier end_barrier (n_threads + 1); // child threads + main thread
    
      std::thread mythread[n_threads];
    
        for (unsigned int i=0; i < n_threads; i++) {
          mythread[i] = std::thread(myfunc, myp[i], start_barrier, end_barrier);
        }
    
      start_barrier.wait (); // first unblock the threads
    
      for (unsigned long int j=0; j < ULONG_MAX; j++) {
        end_barrier.wait (); // mix_data must not execute before the threads are done
        mix_data(myp); 
        start_barrier.wait (); // threads must not start new iteration before mix_data is done
      }
      return 0;
    }
    

提交回复
热议问题