我需要为每个列添加新线程,并且此脚本需要总结此列并显示结果。主要功能必须是这个总和的意思。
问题出现在线程中,他们没有总结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;
}
答案 0 :(得分:1)
多个问题:
您正在main()
末尾附近的循环中创建一堆线程,但您不是在等待使用pthread_join()
完成这些线程。因此,在所有线程完成工作之前,您通常会最终打印结果。
在函数suma
中,您在局部变量struct argument *
中创建struktura
结构的副本,并仅更新该局部变量suma_el
复制。当此功能退出时,其工作结果不会保存在任何地方!
如果修复了第二个问题,则最终操作(a->suma_el) = (a->suma_el) + s
不使用任何形式的同步,因此同时执行该操作的多个线程可能会覆盖彼此的结果。