未通过 CreateThread 传递正确的参数

问题描述 投票:0回答:1

我试图在 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

如有任何帮助,我们将不胜感激。

c windows multithreading
1个回答
0
投票
for (i = 0;i < 10;i++) {
    nameOfThread= LETTERS[i];
    CreateThread(NULL, 0, f, &nameOfThread, 0, &name);
}

您将

nameOfThread
的地址传递给每个线程,但当您循环创建线程时,每次迭代都会覆盖
nameOfThread
的值。

© www.soinside.com 2019 - 2024. All rights reserved.