2011-12-14 59 views
0

我從網上找到了一個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中運行它。我知道應該包含一些標題,但我不知道該怎麼做。

請讓我從開始到結束一步一步告訴我。我在編程初學者請告訴我一步一步...

+0

你可以在你的機器上安裝Linux。它有一個相當不錯的posix線程實現。它會讓你學到很多東西! – 2011-12-14 06:05:43

回答

3

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

上面的鏈接是在Win32一個並行線程部分實現。這有點舊,但它應該完成這項工作。

+0

謝謝,我已經找到了在visual studio中使用pthread的方式,使用你給我的鏈接。我已經完成了所有步驟,比如添加include文件夾和lib文件夾並添加.ddl文件。現在我有pthread header.but有一個問題。我可以成功地建立我的項目,但當我去調試它,我面臨以下錯誤:「」程序不能啓動,因爲pthreadVC2.dll從您的computer.try重新安裝程序來解決問題缺少「」。範你告訴我有關錯誤和如何解決? – user642564 2011-12-15 04:04:28

3

現在,你已經得到了你的程序編譯,需要在兩個地方之一,以找到特定的DLL(pthreadVC2.dll):

  • 1)您的.exe文件位於同一目錄
  • 2)C:\ Windows \ System32下(如果你的操作系統是32位Windows版本)
  • 2)C:\ WINDOWS \ SysWOW64中(如果你的操作系統是64位Windows版本)

真的,「C:\ WINDOWS」在上面的例子應該是你的Windows安裝到實際的路徑,有時這也被拼寫爲%WINDIR%\ SYSTEM32或%WINDIR%\ Syswow64資料

0

短並且易於描述可以發現here (對於所有文件:* .h,* .lib,* .dll)。