我开始使用pthreads cpp库来解决一些作业。
在其中一个中,我必须为从1到T命名的每个文件创建一个线程(T用Define定义为正整数),这个线程必须处理这个文件的一些信息。
实际上,我的想法是在Main中放置一个while循环,如下所示:
pthread_t threads[T];
void *imprime(void *arg) {
int a=-1, b=-1;
string* t = reinterpret_cast<std::string*>(arg); //Recovering str
string name = *t;
cout<<"\nName: "<<name<<endl;
ifstream inFile(nome.c_str());
while(inFile>>a) {
inFile>>b;
cout<<"a: "<<a<<"\nb: "<<b<<endl;
}
}
int main() {
int lim = 1;
string nome;
int a = 0, b = 0;
while(lim <= T) {
nome = to_string(lim);
cout<<"Opening: "<<lim<<endl;
pthread_create(&threads[lim], NULL, &imprime, (void *)&nome);
lim++;
}
cin.get();
return 0;
}
起初,线程没有运行,没有任何反应。所以,我把“cin.get()”置于其间,它突然起作用(我还没理解)。
但是现在,如果T为1,它可以正常工作,但是如果T&gt; 1,它没有像它应该工作的那样工作。
我放了两个文件(名称1,2和3;内联'a'和'b'用空格分隔):
/*
File '1' = "1 2"
File '2' = "3 4"
File '3' = "5 6"
*/
,那就是输出:
Opening: 1
Opening: 2
Opening: 3
Nome: 3
a: 5
b: 6
Nome: 3
a: 5
b: 6
Nome: 3
a: 5
b: 6
由于某种原因,程序在启动线程之前运行整整T次,并且用最后一个线程覆盖每个线程。
我该怎么办?
答案 0 :(得分:1)
将指针传递给nome
是一个坏主意,因为在main
中再次更改之前,您无法确定单个线程是否复制了该值。
为线程的参数创建一个数组:
string threads_args[T];
然后再做
threads_args[lim] = to_string(lim);
cout<<"Opening: "<<lim<<endl;
pthread_create(&threads[lim], NULL, &imprime, (void *)&threads_args[lim]);
进一步通知:
1)你应该join
主线索而不是cin.get
2)while(lim <= T)
应为while(lim < T)
。目前您访问外部数组边界。您也可能希望lim
从0
而不是1
开始,然后threads_args[lim] = to_string(lim+1);
3)C ++ 11有std :: thread,这似乎是比pthread更好的选择