【问题标题】:pthread ( POSIX Threads) in visual studio 2010Visual Studio 2010 中的 pthread(POSIX 线程)
【发布时间】:2012-01-19 21:48:05
【问题描述】:

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

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

【问题讨论】:

  • 你可以在你的机器上安装 Linux。它有一个相当不错的posix线程实现。它会让你学到很多东西!

标签: c windows linux pthreads posix


【解决方案1】:

可以在here找到简短的描述 (对于所有文件:*.h、*.lib、*.dll)。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 谢谢,我找到了使用你给我的链接在 Visual Studio 中使用 pthread 的方法。我已经完成了所有步骤,比如添加包含文件夹和 lib 文件夹并添加 .ddl 文件。现在我有了pthread header.but 有问题。我可以成功构建我的项目,但是当我去调试它时,我遇到以下错误:“”程序无法启动,因为您的计算机中缺少 pthreadVC2.dll。尝试重新安装程序以解决问题“”。 van 你告诉我错误以及如何解决它????
      猜你喜欢
      • 2011-08-04
      • 1970-01-01
      • 2017-12-04
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多