我试图在 C 中创建一个函数,让我在使用 CreateThread 函数时传递一个字符作为其参数。 它在大多数情况下都有效,线程被创建并打印一个字符。问题是,许多线程不打印它们应该打印的字符,而是打印最后一个字符。我认为这与字符如何传递给函数有关,或者可能与同步有关。 这是代码:
#define LETTERS "abcdefghij"
DWORD WINAPI threadFunc(LPVOID param) {
HANDLE sem = OpenSemaphore(SEMAPHORE_ALL_ACCESS, TRUE, (LPCWSTR)"sem");
PCHAR name;
name= (PCHAR)param;
printf("I'm a thread: %c\n", *name);
fflush(stdout);
ReleaseSemaphore(sem, 1, NULL);
return 1;
}
int main()
{
DWORD(*f)(LPVOID);
f = threadFunc;
HANDLE sem = CreateSemaphore(NULL, 0, 10, (LPCWSTR)"sem");
int i;
DWORD name;
CHAR nameOfThread;
for (i = 0;i < 10;i++) {
nameOfThread= LETTERS[i];
CreateThread(NULL, 0, f, &nameOfThread, 0, &name);
}
for (i = 0;i < 10;i++) {
WaitForSingleObject(sem, INFINITE);
}
printf("I'm the process\n");
}
这是执行的结果:
I'm a thread: g
I'm a thread: h
I'm a thread: j
I'm a thread: j
I'm a thread: j
I'm a thread: j
I'm a thread: j
I'm a thread: j
I'm a thread: j
I'm a thread: j
I'm the process
如有任何帮助,我们将不胜感激。
for (i = 0;i < 10;i++) {
nameOfThread= LETTERS[i];
CreateThread(NULL, 0, f, &nameOfThread, 0, &name);
}
您将
nameOfThread
的地址传递给每个线程,但当您循环创建线程时,每次迭代都会覆盖 nameOfThread
的值。