Передача строки в функцию pthread - PullRequest
0 голосов
/ 16 октября 2018

Я новичок, так что терпите меня.Я пытаюсь передать строку в функцию thread_routine1.Он принимает пустой указатель в качестве аргумента.Затем я хочу распечатать его.

void *thread_routine1(void *arg1){
    cout << arg1 << endl;
    pthread_exit(NULL);
}

int main ()
{
    pthread_t thread1;
    string t1 = "hello", t2 = "world";
    pthread_create(&thread1, NULL,thread_routine1, (void *) t1);
    pthread_join(thread1, NULL);
    return 0;
}

В функции pthread_creat я пытаюсь передать строку, но получаю недопустимый тип приведения из строки в указатель void.Я понимаю, что, возможно, я ошибаюсь в нескольких местах, поэтому я был бы признателен за некоторые указания.

1 Ответ

0 голосов
/ 16 октября 2018

Это не имеет ничего общего с 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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...