初始化While循环中的Pthreads

Initializing Pthreads inside While loop

本文关键字:Pthreads 循环 While 初始化      更新时间:2023-10-16

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

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