2011-12-14 17 views
0

私はインターネットからPthreadプログラムを見つけました。ビジュアルスタジオ2010でそれを実行したいのですが、ビジュアルスタジオでpthreadを使用する方法がわかりません。私が見つけたプログラムは次のとおりです:ビジュアルスタジオ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; 
      } 
} 

誰でも私にビジュアルスタジオでそれを実行する方法を教えてもらえますか?私はいくつかのヘッダーを含める必要がありますが、私はそれを行う方法を知らない。

最初から最後まで段階的に教えてください。私は上記のリンクは、Win32上のpthread部分的な実装のためである

+0

マシンにLinuxをインストールできます。それは非常に良いposixスレッドの実装をしています。そしてそれはあなたに大いに多くを学ぶでしょう! –

答えて

3

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

...私はステップバイステップで教えてくださいプログラミング初心者です。それは少し古いですが、それは仕事をする必要があります。

+0

ありがとう、私はあなたが私に与えるリンクを使用してビジュアルスタジオでpthreadを使用する方法を見つけました。私はincludeフォルダとlibフォルダを追加し、.ddlファイルを追加するようなすべてのステップを踏んでいます。問題。私は正常に私のプロジェクトを構築することができますが、私はそれをデバッグするときに私は次のエラーに直面します: "" pthreadVC2.dllがコンピュータから見つからないためプログラムが起動しません。あなたはエラーとそれを解決する方法について教えてくれますか? – user642564

3

今、あなたはあなたのプログラムがコンパイルされてしまったので、次の2つの場所のいずれかで特定のDLL(pthreadVC2.dll)を検索する必要があります。

  • 1)あなたの.exeファイルがあるのと同じディレクトリ
    OR
  • 2)C:\ WINDOWS \ system32に(あなたのOSは、32ビットWindows版の場合)
    OR
  • 2)C:\ WINDOWS \ SYSWOW64(あなたのOSは、64ビットWindows版の場合)

本当に、「C:\ Windowsの」上記の例では、時々、これは%windir%\ system32をかを%windir%\ SYSWOW64

0

短いと綴られるあなたの窓がにインストールされている実際のパス、でなければなりません簡単な説明はhere (すべてのファイル:* .h、* .lib、* .dll)にあります。

関連する問題