2015-01-12 2 views
0

Я создал 4 темы, но когда я уверен, выполнение этой программы я получаю это как выход:Многопоточная программа, выполняющая только последний созданный поток?

Thread #: 1 
Thread #: 2 
Thread #: 3 
Thread #: 3 
Thread #: 4 
Thread #: 4 
Thread #: 4 
Thread #: 5 
Thread #: 5 
Thread #: 5 
. 
. 
. 
Thread #: 5 
Thread #: 5 

У меня 2 вопроса:

  1. я создал только 4 нить так почему показывая поток #: 5
  2. Все созданные 4 потока должны запускаться последовательно, но почему он работает только с последним созданным потоком?

код Источник:

#include<windows.h> 


HANDLE ThreadHandle[4]; 
DWORD dwThreadId[4]; 

DWORD WINAPI ThreadFunction(LPVOID param) 
{ 

    while (1) 
    { 

     printf("Thread #: %d\n", *((int*)param)); 
    } 

    Sleep(10); 

    return 0; 
} 

int main() 
{ 
    static int i = 0; 
    for (i = 1; i <= 4; i++) 
    { 
     ThreadHandle[i] = CreateThread(NULL, 0, ThreadFunction, (LPVOID)&i, 0, &dwThreadId[i]); 
     Sleep(10); 

    }  
    while (1) 
    { 
     Sleep(100); 
    } 
    return 0; 
} 
+2

Массивы с нулевым индексом в C. Запись в 'ThreadHandle [4]' является неопределенным поведением. – EOF

+0

И код не будет компилироваться с текущим использованием {}. И параллельный вывод консоли ... – deviantfan

ответ

7

i является статической переменной - есть только один экземпляр. Вы передаете свой адрес в потоки и разыгрываете его каждый раз, когда вы вызываете printf. Поэтому, когда основной поток изменяет значение i, всего рабочих потоков немедленно увидеть новое значение. По этой причине вы видите нить # 5 - это значение i после завершения цикла for().

Вместо (LPVOID)&i, перейдите (LPVOID)i, и внутри резьбы используйте (int)param вместо *((int*)param). Указатели каста на int и back являются законными в C (хотя и опасны, если их неправильно использовать).

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

  • Нет связанных вопросов^_^