如何在单独的线程中启动数组,每个元素

时间:2011-11-09 20:13:58

标签: c arrays multithreading pointers counter

我正在尝试创建一个大小为n的数组(其中n是用户的输入),当用户运行程序时,数组元素应设置为1(每个都在一个单独的线程中)。以下是我到目前为止所做的事情:

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <process.h>

int *x;

DWORD WINAPI init_X(LPVOID param)
{
    int index = *(int *) param;
    x[index] = 1;

    return 0;
}

int main(int argc, char *argv[])
{
    int n = atoi(argv[1]);
    int i; // counter.
    HANDLE THandles[n];

    x = malloc(n * sizeof (int));

    for(i = 0; i < n; i++)
    {
        THandles[i] = CreateThread(NULL, 0, init_X, &i, 0, NULL);
    }

    // Now wait for threads to finish
    WaitForMultipleObjects(n, THandles, TRUE, INFINITE);

    // Close the thread handle
    for(i = 0; i < n; i++)
    {
        CloseHandle(THandles[i]);
    }

    printf("After initialization x = ");
    for(i = 0; i < n; i++)
    {
        printf("%d ", x[i]);
        if(i < n - 1) printf(" ");
    }

    // ...

    return 0;
}

我运行这个程序,输出错误:

> Test.exe 3
After initialization x = 11611536 11600064 50397186

但它应该是After initialization x = 1 1 1。我不知道如何解决这个问题,但我确信它与指针有关。

P.S:我是Java程序员,所以我不熟悉指针。

2 个答案:

答案 0 :(得分:2)

在线程运行时,您传递的值很可能无效,因为无法保证线程在调用CreateThread后立即运行。

你有两个解决方案,或者按值传递(简单和简单,但总是安全),或者为线程在使用时释放的值分配一个临时缓冲区。 / p>

次要更新:

事实上,更好的方法是通过&x[i],然后你就可以*(int*)param = 1;

答案 1 :(得分:0)

您通过指针将i传递给线程,因此每个线程获得的值取决于int index = *(int *) param;实际执行的时间,它应该是0和{{1}之间的值}。您可以按值传递n(转换为指针)以避免这种情况。