我是pthreads的初学者,所以请耐心等待.我正在尝试将字符串传递给thread_routine1函数.它将void指针作为参数.然后我想把它打印出来.
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;
}
Run Code Online (Sandbox Code Playgroud)
在pthread_creat函数中我试图传递字符串但是我从字符串到void指针获得了无效的强制转换类型.我知道我可能在不止一个地方出错了所以我会很感激一些指示.
Sto*_*ica 10
这与pthreads无关,真的.你做这个演员(void *) t1,主要是把大锤带到类型系统上.
C++中的字符串不是指针,因此将其转换为 - 并将其视为 - 一个只会导致未定义的行为.
这就是为什么要避免使用C风格的演员表的一个原因,因为如果你做了它static_cast<void*>(t1)你已经得到了一个正确的错误,责骂你做了一些你不应该做的事情.
现在,如果你不能使用std::thread其所有抽象,并且必须使用并行线程C API抗衡,要走的路是传递地址的t1.即
pthread_create(&thread1, NULL,thread_routine1, &t1);
Run Code Online (Sandbox Code Playgroud)
现在你甚至不需要演员,因为你正在使用类型系统.对象指针可以隐式转换为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.
}
Run Code Online (Sandbox Code Playgroud)