2017-04-07 143 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) 
{ 
    ... 
} 

第二個問題是您在退出過程之前不等待該線程完成。這將殺死線程。你要麼需要加入的線程,等待它退出。或者你可以分離它,並且只退出主線程(而不是進程),這會讓另一個線程在後臺運行。