2017-04-07 141 views
0
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; 
} 

上面的代码抛出了分段错误。我可能搞砸了我的指针,但我不知道哪里出了问题,我该如何解决?C++ void指针

+1

Here:'cin >> * fname' – Arash

回答

1

您宣布指向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之前释放。

3

两个问题:第一个和可能的原因是,你有一个指针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) 
{ 
    ... 
} 

第二个问题是您在退出过程之前不等待该线程完成。这将杀死线程。你要么需要加入的线程,等待它退出。或者你可以分离它,并且只退出主线程(而不是进程),这会让另一个线程在后台运行。