获取一个线程以在C中多次运行函数 我有这个作业要求我们在一个NXN矩阵中用部分旋转来执行高斯消除,其中任意一个线程的数目都是一个语言,因为现代C++会使这个比你在这里显示的麻烦少。你的代码在C. Read中。如果你想在C++中编码,请阅读。阅读编译器(例如
获取一个线程以在C中多次运行函数获取一个线程以在C中多次运行函数 我有这个作业要求我们在一个NXN矩阵中用部分旋转来执行高斯消除,其中任意一个线程的数目都是一个语言,因为现代C++会使这个比你在这里显示的麻烦少。你的代码在C. Read中。如果你想在C++中编码,请阅读。阅读编译器(例如,c,multithreading,pthreads,C,Multithreading,Pthreads,获取一个线程以在C中多次运行函数 我有这个作业要求我们在一个NXN矩阵中用部分旋转来执行高斯消除,其中任意一个线程的数目都是一个语言,因为现代C++会使这个比你在这里显示的麻烦少。你的代码在C. Read中。如果你想在C++中编码,请阅读。阅读编译器(例如…)和调试器(例如…)的文档,并查看与问题无关的and和and,但如果声明一个函数来返回值,则必须返回某些内容,即使从未使用过。另外,(void*)i是一个不好的类型转换,您确实需要在这里分两步进行转换:(void*)(intptr\t)i。然
我有这个作业要求我们在一个NXN矩阵中用部分旋转来执行高斯消除,其中任意一个线程的数目都是一个语言,因为现代C++会使这个比你在这里显示的麻烦少。你的代码在C. Read中。如果你想在C++中编码,请阅读。阅读编译器(例如…)和调试器(例如…)的文档,并查看与问题无关的and和and,但如果声明一个函数来返回值,则必须返回某些内容,即使从未使用过。另外,
(void*)i
是一个不好的类型转换,您确实需要在这里分两步进行转换:(void*)(intptr\t)i
。然后在线程函数中执行相反的强制转换:intmyid=(int)(intptr\u t)arg
@DayemSaeed:如果你想帮助我,向你的教授提一下。(我今年也碰巧在…@DayemSaeed教编程,“我的教授让我这么做的。”-你的教授建筑师/工程师是以编程为生的吗?不像其他学术界人士一样,把教授们说的作为指导,但要自己做功课,确定什么是事实与虚构。巴西尔有一些坚实的链接,我强烈建议你做一点钻研。选择一种语言,因为现代C++会使这个比你在这里显示的麻烦少。你的代码在C. Read中。如果你想在C++中编码,请阅读。阅读编译器(例如…)和调试器(例如…)的文档,并查看与问题无关的and和and,但如果声明一个函数来返回值,则必须返回某些内容,即使从未使用过。另外,(void*)i
是一个不好的类型转换,您确实需要在这里分两步进行转换:(void*)(intptr\t)i
。然后在线程函数中执行相反的强制转换:intmyid=(int)(intptr\u t)arg
@DayemSaeed:如果你想帮助我,向你的教授提一下。(我今年也碰巧在…@DayemSaeed教编程,“我的教授让我这么做的。”-你的教授建筑师/工程师是以编程为生的吗?不像其他学术界人士一样,把教授们说的作为指导,但要自己做功课,确定什么是事实与虚构。Basile有一些可靠的联系,我强烈建议你做一些练习。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <pthread.h>
#define N 8
double A[N][N+1];
pthread_barrier_t barrier;
int print_matrix()
{
int i, j;
printf("------------------------------------\n");
for(i=0; i<N; i++){
for(j=0;j<N+1;j++)
printf("%6.2f ", A[i][j]);
printf("\n");
}
}
void *ge(void *arg) // threads function: Gauss elimination
{
int i, j, k, prow;
int myid = (int)arg;
double temp, factor;
for(i=0; i<N-1; i++){
if (i == myid){
printf("partial pivoting by thread %d on row %d: ", myid, i);
temp = 0.0; prow = i;
for (j=i; j<=N; j++){
if (fabs(A[j][i]) > temp){
temp = fabs(A[j][i]);
prow = j;
}
}
printf("pivot_row=%d pivot=%6.2f\n", prow, A[prow][i]);
if (prow != i){ // swap rows
for (j=i; j<N+1; j++){
temp = A[i][j];
A[i][j] = A[prow][j];
A[prow][j] = temp;
}
}
}
// wait for partial pivoting done
pthread_barrier_wait(&barrier);
for(j=i+1; j<N; j++){
if (j == myid){
printf("thread %d do row %d\n", myid, j);
factor = A[j][i]/A[i][i];
for (k=i+1; k<=N; k++)
A[j][k] -= A[i][k]*factor;
A[j][i] = 0.0;
}
}
// wait for current row reductions to finish
pthread_barrier_wait(&barrier);
if (i == myid)
print_matrix();
}
}
int main(int argc, char *argv[])
{
int i, j;
double sum;
pthread_t threads[N];
printf("main: initialize matrix A[N][N+1] as [A|B]\n");
for (i=0; i<N; i++)
for (j=0; j<N; j++)
A[i][j] = 1.0;
for (i=0; i<N; i++)
A[i][N-i-1] = 1.0*N;
for (i=0; i<N; i++){
A[i][N] = (N*(N+1))/2 + (N-i)*(N - 1);
}
print_matrix(); // show initial matrix [A|B]
pthread_barrier_init(&barrier, NULL, N); // set up barrier
printf("main: create N=%d working threads\n", N);
for (i=0; i<N; i++){
pthread_create(&threads[i], NULL, ge, (void *)i);
}
printf("main: wait for all %d working threads to join\n", N);
for (i=0; i<N; i++){
pthread_join(threads[i], NULL);
}
printf("main: back substitution : ");
for (i=N-1; i>=0; i--){
sum = 0.0;
for (j=i+1; j<N; j++)
sum += A[i][j]*A[j][N];
A[i][N] = (A[i][N]- sum)/A[i][i];
}
// print solution
printf("The solution is :\n");
for(i=0; i<N; i++){
printf("%6.2f ", A[i][N]);
}
printf("\n");
}