Просто новичок в потоках, я просто выполняю задачу, которая включает в себя эти 2 потока.c - работает 2 потока параллельно с общей переменной
#include <stdio.h>
#include <pthread.h>
int count = 0;
void waitFor(unsigned int secs)
{
unsigned int retTime = time(0) + secs;
while(time(0) < retTime);
}
void func1(void * args)
{
printf("In func1 ...\n");
long i = 0;
while(1){
i++;
if(count == 1)
break;
}
printf("The total number counted is: %ld \n", i);
count = 0;
i = 0;
}
void func2(void * args)
{
printf("In func2 ...\n");
waitFor(3);
count = 1;
}
int main()
{
pthread_t th1, th2;
int j = 0;
while(j++ < 4){
printf("\nRound:\t%d\n", j);
pthread_create(&th1, NULL, (void*)func1,NULL);
pthread_create(&th2, NULL, (void*)func2, NULL);
pthread_join(th1,NULL);
pthread_join(th2,NULL);
waitFor(3);
}
return 0;
}
Я читал различные ссылки и мое понимание pthread_join() означает, что если есть 2 или более потоки, то они будут ждать одну нити, чтобы закончить его выполнение, а затем следующий будет приступить к выполнению и так на.
Но когда я запускаю эту программу, выполняется момент pthread_join (th1), оба потока создаются и исполняются «одновременно». Как это происходит? Выход:
Round: 1
In func2 ...
In func1 ...
The total number counted is: 897651254
Round: 2
In func1 ...
In func2 ...
The total number counted is: 1051386065
........
Моя цель состоит в том, чтобы запустить эти 2 темы параллельно. На данный момент объединение похоже на это; или я где-то ошибаюсь?
И я читал, что использование volatile не является предпочтительным для потоков в C. Так можно ли использовать счет как сигнал от потока 2 к 1?
Где вы читали «, если есть 2 или больше потоков, то они будут ждать, пока один поток завершит выполнение, а затем следующий начнет выполнение "? Pthread_join просто ждет тех потоков, которые вы дали в качестве аргумента для завершения. Что заставляет вас думать, что ваши ступени были созданы, когда вы вызвали pthread_join? Ваши потоки были созданы и запущены с помощью pthread_create. –
Необходимо обеспечить одновременный доступ для чтения/записи к общим переменным ('count' здесь). Обычно это делается с использованием мьютекса. См. Функции 'pthread_mutex _ *()' на них. – alk
@alk, если я заблокирую счет в func2, не будет ли весь мой func1 остановлен, пока func2 не разблокирует счет? или заявления до «count» в func1 выполняются и ждут, пока func2 не разблокирует его? то это означает, что нет права параллелизма? – vinwin