2016-03-21 2 views
0

Есть ли способ гарантировать, что поток был создан до перехода к другим инструкциям (без использования обхода, такого как sleep())?wait for thread creation

У меня есть цикл, который выглядит примерно так:

for(i = 0; i < NUM_THREADS; ++i) 
{ 
    if(pthread_create(&threads_id_array[i], NULL, ThreadFunction, &args)) 
    { 
     perror("pthread_create() error"); 
     exit(1); 
    } 
    args.base += args.offset; 
} 

base Где это указатель на массив. Я хочу убедиться, что поток был создан до продвижения base, чтобы я мог убедиться, что значение args.base в потоке содержит правильное значение. В настоящее время это вызывает ошибки.

+0

Является ли 'args.base' установленным нитью? Потому что существует разница между созданным потоком и выполнением до точки установки значения. –

+1

, когда 'pthread_create()' возвращает 0, поток был «создан». Но будет ли это запущено выполнение или ждет, чтобы быть запланированным, это что-то еще. Вы хотите, чтобы 'args.base' обновлялся только в том случае, если созданный завершен или что-то выполнил? Похоже, что «args.base» обращается к потоку небезопасным образом (возможно, к гонке данных). Опубликуйте [MCVE]. –

+0

@ColonelThirtyTwo, 'args.base' задается основным потоком, а не созданным потоком. – HeyJude

ответ

0

Если вы делаете это, чтобы ускорить работу с процессором, рассмотрите OpenMP вместо pthreads.

Как это:

#pragma omp parallel for 
for(i = 0; i < NUM_THREADS; i++) 
{ 
    auto threadArgs = args; 
    threadArgs.base += i * threadArgs.offset; 
    ThreadFunction(&threadArgs); 
} 
0

В дополнение к @Soonts ответ и @Martin Джеймс комментарий, вот фрагмент другого варианта, а именно - с использованием массива структур, и отправка каждому потоку соответствующий индекс:

char *base_ptr = base; 
args_t args_array[NUM_THREADS]; 

for(i = 0; i < NUM_THREADS; ++i) 
{ 
    args_array[i].base = base_ptr; 
    base_ptr += args_array[i].offset; 
} 

for(i = 0; i < NUM_THREADS; ++i) 
{ 
    if(pthread_create(&threads_id_array[i], NULL, ThreadFunction, &args_array[i])) 
    { 
     perror("pthread_create() error"); 
     exit(1); 
    } 
}