我正在尝试创建一个大小为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程序员,所以我不熟悉指针。
答案 0 :(得分:2)
在线程运行时,您传递的值很可能无效,因为无法保证线程在调用CreateThread
后立即运行。
你有两个解决方案,或者按值传递(简单和简单,但总是安全),或者为线程在使用时释放的值分配一个临时缓冲区。 / p>
次要更新:
事实上,更好的方法是通过&x[i]
,然后你就可以*(int*)param = 1;
答案 1 :(得分:0)
您通过指针将i
传递给线程,因此每个线程获得的值取决于int index = *(int *) param;
实际执行的时间,它应该是0
和{{1}之间的值}。您可以按值传递n
(转换为指针)以避免这种情况。