создавать Pthreads в цикле

Я создаю несколько потоков в цикле for и после этого цикла присоединяю их к другому циклу. они выполняют свою функцию, пока все не закончат ее, не так ли? мой последний результат логически неверен. мой результат правильный, просто когда присоединяюсь к каждому потоку после его создания !!


person user3416282    schedule 14.12.2014    source источник


Ответы (1)


Да, я думаю, вы поступаете правильно. Давайте, например.

extern "C"
 {
    #include <pthread.h>
    #include <unistd.h>
 }
#include <iostream>

using namespace std;

const int NUMBER_OF_THREADS = 5;

void * thread_talk(void * thread_nr)

{
     //do some operation here
     pthread_exit(NULL);         //exit from current thread
}

int main()

{

  pthread_t thread[NUMBER_OF_THREADS];

  cout << "Starting all threads..." << endl;

  int temp_arg[NUMBER_OF_THREADS] ;

  /*creating all threads*/
  for(int current_t = 0; current_t < NUMBER_OF_THREADS; current_t++)
  {

   temp_arg[current_t]   = current_t;

   int result = pthread_create(&thread[current_t], NULL, thread_talk, static_cast<void*>(&temp_arg[current_t]))  ;

   if (result !=0)
   {
   cout << "Error creating thread " << current_t << ". Return code:" << result <<  endl;
   }

  }

 /*creating all threads*/

/*Joining all threads*/
for(int current_t = 0; current_t < NUMBER_OF_THREADS; current_t++)
{
 pthread_join(thread[current_t], NULL);
}

/*Joining all threads*/
cout << "All threads completed." ;

return 0;
}

Это ваше решение, когда вы хотите выйти из этого потока, вызвав pthread_exit function. Абсолютно нет уверенности в том, какой поток будет выполнен первым.Ваша ОС сама решит, когда ресурсы будут доступны для ваших потоков, и выполнит их на том ЦП, который меньше всего занят.

person Ankur    schedule 14.12.2014
comment
спасибо за очень быстрый ответ, я знаю это, но между ними нет никакой зависимости. Я пишу код исключения Гаусса и на каждом шаге просто удаляю один аргумент каждой строки, и мои потоки делают это, когда обнуляю все один столбец, создаю новый поток для устранения другого аргумента матрицы. Я думаю, что некоторые потоки не ждут соединения !! - person user3416282; 14.12.2014
comment
@user3416282 user3416282 Ну, вы не будете присоединяться к потокам, поведение которых может стать неопределенным, что, я думаю, нежелательно. Одна вещь, которую вы можете сделать, это использовать переменную GLOBAL COUNTING, которая будет отслеживать, когда ваша строка становится пустой. - person Ankur; 14.12.2014
comment
моя проблема заключалась в том, что у меня есть один аргумент для всех новых потоков, поэтому, изменяя его для каждого потока, другой делает свою работу неправильно! Спасибо за ваш ответ. - person user3416282; 14.12.2014