作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开始使用 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()”放在 while 下,它突然起作用了(我还不明白)。
但是现在,如果 T 为 1,它可以正常工作,但如果 T > 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
由于某种原因,程序在启动线程之前运行了整个 while T 次,并用最后一个线程覆盖了每个线程。
我能做什么?
最佳答案
将指针传递给 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
main 中的线程而不是使用 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 更好的选择
关于c++ - 在 While 循环中初始化 Pthreads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407211/
我是一名优秀的程序员,十分优秀!