Это не имеет ничего общего с pthreads, правда.Вы делаете это приведение (void *) t1
, которое, по сути, переносит кувалду на систему типов.
Строка в C ++ не является указателем, поэтому приведение к ней и ее обработка как - вызовут тольконеопределенное поведение.
Это одна из причин, по которой следует избегать приведения в стиле C, потому что если бы вы сделали это с static_cast<void*>(t1)
, вы бы получили правильную ошибку, ругая вас за то, что вы не должныне делаю.
Теперь, если вы не можете использовать std::thread
для всех его абстракций и должны бороться с API-интерфейсом pthreads C, нужно пройти через адрес из t1
.Т.е.
pthread_create(&thread1, NULL,thread_routine1, &t1);
И теперь вам даже не нужен приведение, потому что вы работаете с системой типов.Указатель на объект неявно преобразуется в void*
.Хорошо продуманный код не должен быть приправлен приведениями.Они должны быть нечастыми и только по уважительной причине.Кроме того, приведение никогда не должно быть написано просто для "компиляции".
О, и не забудьте выполнить приведение обратно в функцию потока.Теперь у вас есть веская причина, и код будет корректным с простым статическим приведением:
void *thread_routine1(void *arg1){
cout << *static_cast<string*>(arg1) << endl;
pthread_exit(NULL);
return nullptr; // The function's return type is `void*`, not `void`! Do not omit a return statement.
}