C++ void pointers
C++ void pointers
pthread_mutex_t mutexREAD;
int main(int argc, char *argv[]){
pthread_t READERthreads;
pthread_mutex_init(&mutexREAD, NULL);
string *fname;
cin>> *fname;
pthread_create(&READERthreads, NULL, reader_thread, (void*) fname);
}
void *reader_thread(void *param){
string fname = *(string *) param;
cout<<"filename is "<< fname<<endl;
ifstream myfile(fname.c_str());
return NULL;
}
上面的代码抛出分段错误。我可能搞砸了我的指针,但我不知道哪里出了问题,我该如何解决?
两个问题:崩溃的第一个也是可能的原因是你有一个指针fname
但它实际上并没有指向任何地方。当您取消引用它时,这会导致未定义的行为。
除非你需要将不同的字符串传递给不同的线程,否则它不需要是一个指针,只需在调用pthread_create
时使用地址运算符&
即可。
当然,您可以改用std::thread
,并按值传递字符串,而不必担心指针:
...
std::string fname;
std::cin >> fname;
std::thread READERthread{&reader_thread, fname);
READERthread.join();
...
和
void reader_thread(std::string fname)
{
...
}
第二个问题是,在退出进程之前,您不会等待线程完成。这将杀死线程。您要么需要加入线程,等待它退出。或者你可以分离它,只退出主线程(而不是进程(,这会让另一个线程在后台运行。
你声明了一个指向string
的指针,只需使用string
并传递其地址。
pthread_mutex_t mutexREAD;
int main(int argc, char *argv[]){
pthread_t READERthreads;
pthread_mutex_init(&mutexREAD, NULL);
string fname;
cin>> fname;
pthread_create(&READERthreads, NULL, reader_thread, (void*) &fname);
pthread_join(&READERthreads,NULL);
}
void *reader_thread(void *param){
string fname = *(string *) param;
cout<<"filename is "<< fname<<endl;
ifstream myfile(fname.c_str());
return NULL;
}
另一个问题是你不等待线程终止,那么堆栈分配的字符串可能会在线程有时间使用它之前被释放......在生成线程中使用pthread_join
。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么我在使用void函数时得到错误代码C2276
- void*到驱动程序中的UnicodeString
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- Python ctypes and void const pointers
- C++ void pointers
- 使用void Pointers(Cuba Nint常规)时施放功能