for (int i = 1; i < argv[1]; ++i)
неверно в вашем main
(а return ret
неверно в printer
), потому что i
является целым числом, но argv[1]
имеет тип char*
, так же как и указатель.Возможно, вы имеете в виду (в вашем main
):
int n = atoi(argv[1]);
for (int i=1; i<n; i++)
Не забудьте скомпилировать все предупреждения и информацию об отладке: g++ -Wall -Wextra -g
с GCC для кода C ++ или gcc -Wall -Wextra -Wmissing-prototypes -g
дляС кодом.В C ++ вы можете использовать <thread>
.Улучшайте свой код, чтобы вообще не получать предупреждений.Прочитайте Как отлаживать небольшие программы .Узнайте, как использовать gdb
отладчик .
Обратите внимание, что return -1
- это плохой вкус в вашем main
(по крайней мере, в Linux см. execve (2) и прочитайте об отношениях между main
и execve
в вашей оболочке).Вы должны вернуть EXIT_FAILURE
(или использовать exit
для этого).
Кстати, pthread_t
обычно является целым типом, но стандарт POSIX нене указывать, какой.Если вы хотите напечатать один, на практике вам лучше привести его явно к какому-нибудь достаточно широкому целочисленному типу, например long long
и коду printf("This is pthread %lld\n",(long long) self_id);
, который не выдаст вам никакого предупреждения.
Наконец, я рекомендую сначала изучить язык программирования (C намного проще, чем C ++, и вам нужно выбирать между ними) и использовать его для последовательного программирования, а позже обучение pthreads .Параллельное программирование потоков - сложная тема.Начиная с многопоточного программирования, вы ставите планку слишком высоко.Прежде чем пытаться использовать pthreads, изучите основы последовательного программирования.Смотрите также http://norvig.com/21-days.html для полезного понимания.Кстати, если вы никогда не программировали, SICP является отличным введением (в нем не используются C или C ++ или потоки).
Конечно, вы не позволяете другим вашим потокам работать достаточновремя.Вы могли бы sleep
немного - в главном потоке - перед возвратом из main
, и вам действительно следует дождаться своих потоков, как объяснил Мартин Йорк .
Но я думаю, что вам нужно изучить последовательное программирование, прежде чем пытаться использовать многопоточность.