Как уже упоминалось в комментарии groo , программа не будет работать правильно, если вновь созданный поток начинает выполнение, когда основной поток уже завершил l oop.
Это вероятно, происходит, когда основной поток не задерживается при вызове printf
.
Добавьте строку
printf("Thread started when timeStepCounter is %d\n",timeStepCounter);
до
while (timeStepCounter < endtime);
и вы, вероятно, увидите
Thread started when timeStepCounter is 1000
Кроме того, вы должны объявить переменные, к которым обращается более одного потока, как volatile
, то есть
volatile int timeStepCounter;
, и убедиться, что он использует тип с доступом atomi c , (Если бы не было Atomi c, вам потребовалась бы синхронизация.)
Даже если только один поток изменяет значение, компилятор с оптимизацией обнаружит, что timeStepCounter
не изменяется в l oop
while (timeStepCounter < endtime);
и создайте код, подобный
while(1);
Ключевое слово volatile
сообщает компилятору, что значение может быть изменено вне обычного потока программы, что происходит при использовании потоков. (Компилятор не знает о потоках.)
Я могу убедиться в этом, скомпилировав код без volatile
и с некомментированным printf
с
gcc -g -Wall -Wextra -pedantic -O3 test.c -lpthread -o test
Я получаю, например,
...
Creating thread @ 158
...
Thread started when timeStepCounter is 226
...
но нет
Finished when timeStepCounter is ...