我從網上找到了一個Pthread程序,我想在Visual Studio 2010中運行它,但是我不知道如何在visual studio中使用pthread。以下是我找到的程序:Visual Studio 2010中的pthread(POSIX線程)
#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中運行它。我知道應該包含一些標題,但我不知道該怎麼做。
請讓我從開始到結束一步一步告訴我。我在編程初學者請告訴我一步一步...
你可以在你的機器上安裝Linux。它有一個相當不錯的posix線程實現。它會讓你學到很多東西! – 2011-12-14 06:05:43