Visual Studio 2010中的pthread(POSIX Threads)

时间:2011-12-14 03:03:16

标签: c windows linux pthreads posix

我从互联网上找到了一个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中运行它。我知道应该包括一些标题,但我不知道该怎么做。

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

3 个答案:

答案 0 :(得分:3)

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

以上链接用于Win32上的pthreads部分实现。它有点旧,但它应该可以完成这项工作。

答案 1 :(得分:3)

现在您已经编译了程序,您需要在以下两个位置之一找到特定的dll(pthreadVC2.dll):

  • 1)您的.exe文件所在的目录中 OR
  • 2)C:\ Windows \ system32(如果您的操作系统是32位Windows版本)
    OR
  • 2)C:\ Windows \ SysWOW64(如果您的操作系统是64位Windows版本)

实际上,上面示例中的“C:\ Windows”应该是您安装Windows的实际路径,有时这个拼写为%windir%\ system32或%windir%\ SysWOW64

答案 2 :(得分:0)

可以找到简短易懂的说明here (对于所有文件:* .h,* .lib,* .dll)。