2016-10-10 2 views
-2

У меня проблема, когда я пытаюсь синхронизировать свои потоки. У меня есть следующий код:Не удается синхронизировать мои потоки в C

static void* CarProcess(void *str); 

int main() 
{ 
    thread_t *pthreadsArray; 
    pthreadsArray = (thread_t*)malloc(sizeof(thread_t) * 10); 

    for (int i = 0; i < 10; i++) 
    { 
     int pthread = mythread_create(&pthreadsArray[i], NULL, CarProcess, i); 
    } 
    for (int i = 0; i < 10; i++) 
    { 
     mythread_join(pthreadsArray[i], NULL); 
    } 
} 

static void* CarProcess(void *str) 
{ 
    while(1){ 
     printf("Thread ID: %i\n", str); 
    } 
} 

Когда я выполнить программу, у меня есть этот выход:

Thread ID: 0 
Thread ID: 0 
Thread ID: 0 
Thread ID: 0 
... 

Но никогда не появится "Thread ID: 1", "Thread ID: 2", «Thread ID: 3 ".... или" ID темы: 9 ". Я думаю, что это можно решить с помощью Mutex, блокировки и разблокировки Mutex. Есть ли у любого органа идея, как это решить? Спасибо

+0

неродственных на ваш вопрос, но я предполагаю, что ваша фактическая программа имеет динамическое количество потоков? В противном случае использование 'malloc' просто не нужно, и вы можете просто использовать обычный массив. –

+0

Кроме того, что такое 'mythread_create' и' mythread_join'? –

+0

спасибо @JoachimPileborg, но кажется, что вы мало что знаете о потоках. Create and Join - это функции из библиотеки потоков. –

ответ

2

Один из возможных источников проблемы заключается в том, что str на самом деле не является переменной int. Вам нужно сделать кастинг (как при создании потока, так и при получении аргумента).

Чтобы создать поток и правильно передать целое число, нужно сначала присвоить значение intptr_t, которое является standard integer type достаточно большим, чтобы соответствовать целому или указателю. Тогда вы должны бросить его в общий указатель (т.е. void *):

pthread_create(&pthreadsArray[i], NULL, CarProcess, (void *) (intptr_t) i); 

Тогда, чтобы получить целое значение внутри функции потока нужно делать противоположное литье:

static void* CarProcess(void *str) 
{ 
    int i = (int) (intptr_t) str; 
    printf("Thread ID: %i\n", i); 
} 
+0

Спасибо, но проблема не в переменной кастинга .. Является ли синхронизация потоков .. Мне нужно многопоточность .. –

+2

@ArturoSalas Если код является именно тем, что вы показываете, тогда нет никакой необходимости в синхронизации. Ни один из потоков не имеет доступа к общим данным. Синхронизация необходима только в том случае, если вы получаете доступ к общим данным таким образом, чтобы один поток мог изменять его, а другой читал его. –

+0

Это только печать сообщения из первого потока, а не из других 9 потоков .. это не многопоточность –

Смежные вопросы