#include <stdio.h>
#include <pthread.h>
typedef struct {
int threadNum;
}thread_args;
void thread_func(void*vargp){
thread_args*id=(thread_args*)vargp;
printf("%i\n",id->threadNum);
}
int main() {
for(int i=0;i<20;i++) {
pthread_t id;
thread_args args;
args.threadNum=i;
pthread_create(&id,NULL,thread_func,(void*)&args);
}
pthread_exit(NULL);
return 0;
}
Адаптировано с https://www.geeksforgeeks.org/multithreading-c-2/.
Таким образом, ожидается, что это выведет:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Но перетасовано в случайном порядке для учета параллелизма потоков.
Проблема здесь в том, что на самом деле распечатывает это:
4
9
10
5
11
12
13
8
4
4
17
6
18
7
15
19
6
14
19
16
Как видите, есть повторяющиеся числа, а 0-3 просто пропущены.
Ранее я уже выполнял параллелизм в других платформах, и я видел похожие проблемы: здесь происходит то, что i
передается как ссылка (я думаю!) И так, когда цикл for
увеличивается i
, он увеличивается во всех переменных аргумента потока.
Как мне этого избежать?
ПРИМЕЧАНИЕ: все связывается на 100% правильно, и я нахожусь на macOS.
PS: Извините, если это дубликат, я не очень опытен с этим.