У меня есть программа с функцией, которая принимает указатель как arg и main. Главное - создавать потоки  n, каждый из которых выполняет функцию в разных областях памяти в зависимости от прошедшего arg. Затем потоки соединяются, основной выполняет некоторые смешения данных между областью и создает  n новые потоки, которые выполняют ту же операцию, что и старые.
Чтобы улучшить программу, я хотел бы сохранить потоки живыми, удалив длительное время, необходимое для их создания. Нити должны спать, когда основное устройство работает и уведомляется, когда им приходится подниматься снова. Точно так же основной должен ждать, когда потоки работают так же, как и с join.
Я не могу закончить сильную реализацию этого, всегда попадая в тупик.
Простой базовый код, любые подсказки о том, как его изменить, будут высоко оценены
#include <thread>
#include <climits>
...
void myfunc(void * p) {
  do_something(p);
}
int main(){
  void * myp[n_threads] {a_location, another_location,...};
  std::thread mythread[n_threads];
  for (unsigned long int j=0; j < ULONG_MAX; j++) {
    for (unsigned int i=0; i < n_threads; i++) {
      mythread[i] = std::thread(myfunc, myp[i]);
    }
    for (unsigned int i=0; i < n_threads; i++) {
      mythread[i].join();
    }
    mix_data(myp); 
  }
  return 0;
}
