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

Problems with POSIX. Threads doesn't work properly

本文关键字:常工作 工作 问题 线程 POSIX      更新时间:2023-10-16

我需要为每个列新线程制作,并且此脚步需要总结此列并显示结果。主要函数必须使这一总和表示。

问题是在线程中,它们不总结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. 您是在main()末端附近的环中创建一堆线程,但是您没有等待这些线程通过使用pthread_join()完成。结果,您通常最终会在所有线程完成工作之前打印结果。

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

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