POSIX的问题。线程无法正常工作

时间:2017-04-27 19:44:20

标签: c++ unix posix

我需要为每个列添加新线程,并且此脚本需要总结此列并显示结果。主要功能必须是这个总和的意思。

问题出现在线程中,他们没有总结kolumns或任何东西。你能告诉我为什么它不起作用吗?

这是代码:

    #include <cstdio>
#include <iostream>
#include <pthread.h>
#include <time.h>

using namespace std;
struct argument
{
    int iteracja;
    double line;
    double kolumn;
    double **tablica;
    double suma_el;

};
void *suma(void *par);

int main()
{
    argument a1;                                        //element globalny żeby był też do wątków
    argument *p_a1=&a1; 
    a1.suma_el = 0;
    int line, kolumn;                           //ilosc lini i kolumn
    cout << "Podaj liczbe kolumn:" << endl;
    cin >> kolumn;                              //podajemy liczbe kolumn tym samym liczbe watkow
    p_a1->kolumn = kolumn;                      //liczbe kolumn wpisujemy do struktury przekazywanej do watku
    cout << "Podaj liczbę wierszy" << endl;
    cin >> line;                                //podajemy liczbe wierszy
    p_a1->line = line;                          //liczbe wierszy wpisujemy do struktury przekazywanej do watku
    double **tab = new double*[line];           //tworzymy tablice 2D 
    for (int i = 0; i < kolumn; i++)
    {
        tab[i] = new double[kolumn];
    }
    for (int i = 0; i < line; i++)
    {
        for (int j = 0; j < kolumn; j++)
        {
            cout << "Podaj element [" << i + 1 << "][" << j + 1 << "] tablicy:" << endl;
            cin >> tab[i][j];
        }
    }
    p_a1->tablica= tab;
    for (int i = 0; i < line; i++)                          //wypelniona tablice 2D wypisujemy i przekazujemy do 
    {
        for (int j = 0; j < kolumn; j++)
        {
            cout << tab[i][j] << "\t";
        }
        cout << endl;
    }
    for (int i = 0; i < kolumn; i++)                                    //tworzymy watki a kazdy watek liczy nam sume 
    {
        (p_a1->iteracja) = i;
        pthread_t watek;
        pthread_create(&watek, NULL, suma, (void*)p_a1);
    }
    double srednia = 0;
    srednia = (p_a1->suma_el) / kolumn;
    cout << "Srednia suma kazdej kolumny wynosi:" << srednia << endl;
    return 0;
}

void *suma(void *par)
{
    argument struktura=*((argument*)par);
    argument *a = &struktura;
    double s = 0;
    int j = (a->iteracja);
    for (int k = 0; k < a->line; k++)
    {
        s = s + a->tablica[k][j];
    }
    cout << "Suma kolumny " << j << ":\t" << s << endl;
    (a->suma_el) = (a->suma_el) + s;
    return 0;
}

1 个答案:

答案 0 :(得分:1)

多个问题:

  1. 您正在main()末尾附近的循环中创建一堆线程,但您不是在等待使用pthread_join()完成这些线程。因此,在所有线程完成工作之前,您通常会最终打印结果。

  2. 在函数suma中,您在局部变量struct argument *中创建struktura结构的副本,并仅更新该局部变量suma_el复制。当此功能退出时,其工作结果不会保存在任何地方!

  3. 如果修复了第二个问题,则最终操作(a->suma_el) = (a->suma_el) + s不使用任何形式的同步,因此同时执行该操作的多个线程可能会覆盖彼此的结果。