gpt4 book ai didi

c - visual studio 2010 中的 pthread(POSIX 线程)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:49:30 24 4
gpt4 key购买 nike

我从互联网上找到了一个 Pthread 程序,我想在 visual studio 2010 中运行它,但我不知道如何在 visual studio 中使用 pthread。以下是我找到的程序:

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 4096
#define NO_PROCESS 8

typedef double matrix[MAX_SIZE][MAX_SIZE];

int N; /* matrix size */
int maxnum; /* max number of element*/
char *Init; /* matrix init type */
int PRINT; /* print switch */
matrix A; /* matrix A */
double b[MAX_SIZE]; /* vector b */
double y[MAX_SIZE]; /* vector y */
pthread_barrier_t barrier;

/* forward declarations */
void work(void*);
void Init_Matrix(void);
void Print_Matrix(void);
void Init_Default(void);
int Read_Options(int, char **);

int main(int argc, char **argv)
{
pthread_t threads[NO_PROCESS];
int timestart, timeend, iter;
long i;

Init_Default(); /* Init default values */
Read_Options(argc, argv); /* Read arguments */
Init_Matrix(); /* Init the matrix */

pthread_barrier_init(&barrier, NULL, NO_PROCESS);

for (i = 0; i < NO_PROCESS; i++)
pthread_create (&threads[i], NULL, (void *) &work, (void *) i);

for (i = 0; i < NO_PROCESS; i++)
pthread_join(threads[i], NULL);

pthread_barrier_destroy(&barrier);

if (PRINT == 1)
Print_Matrix();
}

void work(void *pId)
{
int i, j, k;
long thread_id = (long)pId;

/* Gaussian elimination algorithm */

for (k = 0; k < N; k++)
{ /* Outer loop */

if (thread_id == (k % NO_PROCESS))
{
for (j = k + 1;(j < N); j++)
A[k][j] = A[k][j] / A[k][k]; /* Division step */

y[k] = b[k] / A[k][k];

A[k][k] = 1.0;
}

pthread_barrier_wait(&barrier); /* wait for other threads finishing this round */

for (i = k + 1;(i < N); i++)
{
if (thread_id == (i % NO_PROCESS))
{
for (j = k + 1;(j < N); j++)
A[i][j] = A[i][j] - A[i][k] * A[k][j]; /* Elimination step */

b[i] = b[i] - A[i][k] * y[k];

A[i][k] = 0.0;
}
}

pthread_barrier_wait(&barrier); /* wait for other threads finishing this round */

}
}

void Init_Matrix()
{
int i, j;

printf("\nsize = %dx%d ", N, N);
printf("\nmaxnum = %d \n", maxnum);
printf("Init = %s \n", Init);
printf("Initializing matrix...");

if (strcmp(Init, "rand") == 0)
{
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
if (i == j) /* diagonal dominance */
A[i][j] = (double)(rand() % maxnum) + 5.0;
else
A[i][j] = (double)(rand() % maxnum) + 1.0;
}
}
}

if (strcmp(Init, "fast") == 0)
{
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
if (i == j) /* diagonal dominance */
A[i][j] = 5.0;
else
A[i][j] = 2.0;
}
}
}

/* Initialize vectors b and y */
for (i = 0; i < N; i++)
{
b[i] = 2.0;
y[i] = 1.0;
}

printf("done \n\n");

if (PRINT == 1)
Print_Matrix();
}

void Print_Matrix()
{
int i, j;

printf("Matrix A:\n");

for (i = 0; i < N; i++)
{
printf("[");

for (j = 0; j < N; j++)
printf(" %5.2f,", A[i][j]);

printf("]\n");
}

printf("Vector b:\n[");

for (j = 0; j < N; j++)
printf(" %5.2f,", b[j]);

printf("]\n");

printf("Vector y:\n[");

for (j = 0; j < N; j++)
printf(" %5.2f,", y[j]);

printf("]\n");

printf("\n\n");
}

void Init_Default()
{
N = 2048;
Init = "rand";
maxnum = 15.0;
PRINT = 0;
}

int Read_Options(int argc, char **argv)
{
char *prog;
prog = *argv;

while (++argv, --argc > 0)
if (**argv == '-')
switch ( *++*argv )
{

case 'n':
--argc;
N = atoi(*++argv);
break;

case 'h':
printf("\nHELP: try sor -u \n\n");
exit(0);
break;

case 'u':
printf("\nUsage: sor [-n problemsize]\n");
printf(" [-D] show default values \n");
printf(" [-h] help \n");
printf(" [-I init_type] fast/rand \n");
printf(" [-m maxnum] max random no \n");
printf(" [-P print_switch] 0/1 \n");
exit(0);
break;

case 'D':
printf("\nDefault: n = %d ", N);
printf("\n Init = rand" );
printf("\n maxnum = 5 ");
printf("\n P = 0 \n\n");
exit(0);
break;

case 'I':
--argc;
Init = *++argv;
break;

case 'm':
--argc;
maxnum = atoi(*++argv);
break;

case 'P':
--argc;
PRINT = atoi(*++argv);
break;

default:
printf("%s: ignored option: -%s\n", prog, *argv);
printf("HELP: try %s -u \n\n", prog);
break;
}
}

谁能告诉我如何在 visual studio 中运行它。我知道应该包含一些标题,但我不知道该怎么做。

请从头到尾一步步告诉我。我是编程初学者,请逐步告诉我...

最佳答案

http://sourceware.org/pthreads-win32/

以上链接适用于 Win32 上的 pthreads 部分实现。它有点旧,但应该可以胜任。

关于c - visual studio 2010 中的 pthread(POSIX 线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8499074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com