我有以下代码,应该以.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
答案 0 :(得分:3)
fn1的地址在您创建的主线程和辅助p_thread之间共享。 当新线程进行自举时,主线程会更改'fn1'内存地址中的值,而辅助线程会读取不同文件的名称(因为在主线程中fn1现在有一个新值)。
你需要创建一个传递给辅助线程的字符串的副本,或者你需要同步你的读/写,我会推荐前者,因为它更容易。
在这一行: if(rc = pthread_create(&amp; t1,NULL,&amp; workHorse,(void *)&amp; fn1))
您正在传递fn1的地址,然后在主循环中将值更改为其他一些文件名,并且当踏板出现时,它现在处于RGBbmp.bmp