gpt4 book ai didi

c++ - 在 While 循环中初始化 Pthreads

转载 作者:行者123 更新时间:2023-11-28 05:26:47 25 4
gpt4 key购买 nike

我开始使用 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) .当前您访问外部数组边界。你也可能想要 lim0 开始而不是 1然后有 threads_args[lim] = to_string(lim+1);

3) C++11 有 std::thread ,这似乎是比 pthread 更好的选择

关于c++ - 在 While 循环中初始化 Pthreads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com