在While循环中初始化Pthreads

时间:2016-11-03 16:56:11

标签: c++ multithreading pthreads

我开始使用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次,并且用最后一个线程覆盖每个线程。

我该怎么办?

1 个答案:

答案 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)。目前您访问外部数组边界。您也可能希望lim0而不是1开始,然后threads_args[lim] = to_string(lim+1);

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