初始化While循环中的Pthreads
Initializing Pthreads inside While loop
我开始使用pthreads CPP库来解决一些作业。
在其中一个,我必须创建一个线程为每个文件命名从1到T (T是固定的定义为一个正整数),这个线程必须处理这个文件的一些信息。
实际上,我的想法是在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> 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)你应该在main中join
线程而不是使用cin.get
2) while(lim <= T)
应为while(lim < T)
。当前您访问数组边界外。此外,你可能希望lim
从0
开始,而不是从1
开始,然后是threads_args[lim] = to_string(lim+1);
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 在基于范围的for循环中使用结构化绑定声明
- 用于C++中带有数组和指针的循环
- 循环中的随机函数
- pthreads:使用 while 循环进行pthread_cond_wait背后的逻辑
- 初始化While循环中的Pthreads