Я создаю несколько потоков в цикле for и после этого цикла присоединяю их к другому циклу. они выполняют свою функцию, пока все не закончат ее, не так ли? мой последний результат логически неверен. мой результат правильный, просто когда присоединяюсь к каждому потоку после его создания !!
создавать Pthreads в цикле
Ответы (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
спасибо за очень быстрый ответ, я знаю это, но между ними нет никакой зависимости. Я пишу код исключения Гаусса и на каждом шаге просто удаляю один аргумент каждой строки, и мои потоки делают это, когда обнуляю все один столбец, создаю новый поток для устранения другого аргумента матрицы. Я думаю, что некоторые потоки не ждут соединения !!
- person user3416282; 14.12.2014
@user3416282 user3416282 Ну, вы не будете присоединяться к потокам, поведение которых может стать неопределенным, что, я думаю, нежелательно. Одна вещь, которую вы можете сделать, это использовать переменную GLOBAL COUNTING, которая будет отслеживать, когда ваша строка становится пустой.
- person Ankur; 14.12.2014
моя проблема заключалась в том, что у меня есть один аргумент для всех новых потоков, поэтому, изменяя его для каждого потока, другой делает свою работу неправильно! Спасибо за ваш ответ.
- person user3416282; 14.12.2014