2011-12-14 3 views
0

Я нашел программу Pthread из Интернета, и я хочу запустить ее в visual studio 2010, но я не знаю, как использовать pthread в visual studio. следующая программа, которую я нашел:pthread (POSIX Threads) в visual studio 2010

#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; 
      } 
} 

Может кто-нибудь сказать мне, как запустить его в визуальной студии. Я знаю, что должен быть включен какой-то заголовок, но я не знаю, как это сделать.

Пожалуйста, дайте мне знать от начала до конца шаг за шагом. Я новичок в программировании, пожалуйста, скажите мне, шаг за шагом ...

+0

Вы можете установить Linux на свой компьютер. Он имеет неплохую реализацию нити posix. И это научит вас большой судьбе! –

ответ

3

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

выше ссылка для PThreads частичной реализации на Win32. Он немного стар, но он должен выполнять эту работу.

+0

спасибо, я нашел способ использовать pthread в visual studio, используя ссылку, которую вы даете мне. Я сделал все шаги, например, добавлю папку с папкой и lib и добавлю файл .ddl. Теперь у меня есть pthread header.but проблема. я могу успешно создать свой проект, но когда я иду отлаживать его, я сталкиваюсь со следующей ошибкой: «« программа не может запускаться, потому что pthreadVC2.dll отсутствует на вашем компьютере. переустановка программы для устранения проблемы ». Ван вы расскажите мне об ошибке и о том, как ее решить ???? – user642564

3

Теперь, когда у вас есть ваша программа компилируется, вам нужно найти конкретный DLL (pthreadVC2.dll) в одном из двух мест:

  • 1) То же директория вашего exe-файл находится в
    ИЛИ
  • 2) C: \ Windows \ system32 (если ваша операционная система является 32-битной версией Windows)
    ИЛИ
  • 2) C: \ Windows \ SysWOW64 (если ваша операционная система является 64-битной версией Windows)

Действительно, «C: \ Windows» в приведенных выше примерах, должен быть фактический путь ваши окна установлены в, иногда это прописано в% WINDIR% \ system32 или% WINDIR% \ SysWOW64

0

Короткий и простое описание можно найти here (для всех файлов: * .h, * .lib, * .dll).