我的线程程序有什么问题?

时间:2014-01-20 22:44:48

标签: c++ pthreads

我有以下代码,应该以.NEF扩展名来处理。

#include <iostream>
#include <regex>
#include <pthread.h>
#include <dirent.h>

using namespace std;

void *workHorse(void*);

int main (int argc, char *argv[]){
   pthread_t t1;
   int rc, pos1;
   DIR *dir;
   struct dirent *ent;
   regex e("(.*)(\\.)(NEF|nef)");
   if ((dir = opendir (".")) != NULL) {
      string fn1;
      while ((ent = readdir (dir))!=NULL){
         fn1.assign(ent->d_name);
         if (regex_match ( fn1, e )){
            cout<<"F :"<<fn1.c_str()<<" "<<endl;
            if (rc=pthread_create( &t1, NULL, &workHorse, (void*)&fn1)){
               cout<<"Error creating threads "<<rc<<endl;
               exit(-1);
            }
         }
      }
   }
   return 0;
}

void *workHorse(void *fileName){
   int ret;
   cout<<"W :"<<((string*)fileName)->c_str()<<endl;
   pthread_exit(NULL);
}

目录中只有一个扩展名为.NEF的文件。我的预期输出是 -

F :DSC_0838.NEF 
W :DSC_0838.NEF

然而,我得到了

F :DSC_0838.NEF 
W :RGBbmp.bmp

RGBbmp.bmp是同一目录中的另一个文件。我的代码出了什么问题?为什么它不能按预期工作?

上面的代码是使用 -

编译的
g++ tmp.cpp -pthread --std=c++11

1 个答案:

答案 0 :(得分:3)

fn1的地址在您创建的主线程和辅助p_thread之间共享。 当新线程进行自举时,主线程会更改'fn1'内存地址中的值,而辅助线程会读取不同文件的名称(因为在主线程中fn1现在有一个新值)。

你需要创建一个传递给辅助线程的字符串的副本,或者你需要同步你的读/写,我会推荐前者,因为它更容易。

在这一行: if(rc = pthread_create(&amp; t1,NULL,&amp; workHorse,(void *)&amp; fn1))

您正在传递fn1的地址,然后在主循环中将值更改为其他一些文件名,并且当踏板出现时,它现在处于RGBbmp.bmp