POSIX 的问题。线程无法正常工作
Problems with POSIX. Threads doesn't work properly
我需要为每个列新线程制作,并且此脚步需要总结此列并显示结果。主要函数必须使这一总和表示。
问题是在线程中,它们不总结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;
}
多个问题:
-
您是在
main()
末端附近的环中创建一堆线程,但是您没有等待这些线程通过使用pthread_join()
完成。结果,您通常最终会在所有线程完成工作之前打印结果。 -
在函数
suma
中,您在本地变量struktura
中创建struct argument *
结构的副本,仅在该本地副本中更新字段suma_el
。当此功能退出时,其工作的结果不会在任何地方保存! -
如果第二期已修复,则最终操作
(a->suma_el) = (a->suma_el) + s
不使用任何形式的同步,因此同时执行该操作的多个线程可能会覆盖对方的结果。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程