Я попытался скомпилировать следующий код из учебника, используя онлайн-компилятор. Вот код:
#include <iostream>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>
using namespace std;
#define NUM_THREADS 5
void *PrintHello(void *threadid)
{
long *tid;
tid = (long*)threadid;
cout << "Hello World! Thread ID, " << *tid << endl;
pthread_exit(NULL);
}
int main ()
{
pthread_t threads[NUM_THREADS];
int rc;
long i;
for( i=0; i < NUM_THREADS; i++ ){
cout << "main() : creating thread, " << i << endl;
rc = pthread_create(&threads[i], NULL,
PrintHello, (void *)&i);
if (rc){
cout << "Error:unable to create thread," << rc << endl;
exit(-1);
}
}
sleep(1000000);
pthread_exit(NULL);
}
Это результат:
main() : creating thread, 0
main() : creating thread, 1
main() : creating thread, 2
main() : creating thread, Hello World! Thread ID, 23
main() : creating thread, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 5
main() : creating thread, 0
main() : creating thread, 1
Hello World! Thread ID, 1
main() : creating thread, 2
Hello World! Thread ID, 2
main() : creating thread, 3
Hello World! Thread ID, 3
main() : creating thread, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 5
main() : creating thread, 0
main() : creating thread, 1
main() : creating thread, 2
Hello World! Thread ID, 2main() : creating thread, 3
main() : creating thread, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 5
Почему "создание потока, x" написано несколько раз выше? Цикл должен был работать сразу? пс. Также, когда я запускаю этот код в одном компиляторе, ничего не выводится. имп. Я немного изменил пример, пример напрямую проходил (void *)i
в поток, который мне не понравился.
Попробуйте запустить тот же код без линии сна. Мне кажется, что что-то не так с онлайн-инструментом.
Это потому, что вы передаете тот же указатель на все потоки. Адрес переменной i
не изменяется между вызовами pthread_create
.
Существует несколько способов решить эту проблему: первый способ - выделить пространство в куче (например, new
или malloc
) и передать этот указатель на функцию потока. Другая функция, которую я действительно не рекомендую, потому что она зависит от поведения компиляторов, специфичного для реализации, заключается в передаче фактического значения в качестве указателя (например, (void *) i
).
Решение, которое я рекомендую, заключается в использовании std::thread
вместо функций потока POSIX.
i
нравится, это не сработает. Вы отправляете указатель на одну и ту же переменную для каждого потока. Вы, вероятно, хотели отправить разные данные в каждый поток.