在 single/multiple 个线程中编辑结构实例的成员值

Editing structure instance's member values inside single/multiple thread(s)

我正在尝试在 Windows 上的 single/multiple 个线程中编辑结构的成员值,考虑以下示例:

#include <windows.h>
#include <stdio.h>

typedef struct {
    int val;
} object;

DWORD WINAPI edit_obj(LPVOID *lpParameter) {
    object a = *(object*)lpParameter;
    a.val = 20;

    return 0;
}

int main() {
    object a;
    a.val = 5;
    printf("a.val before edit: %d\n", a.val);

    CreateThread(0, 0, edit_obj, &a, 0, 0);
    printf("a.val after edit: %d\n", a.val);

}

我知道我正在创建 a 的复制对象。我对如何实现这一点一无所知,或者如果可能的话,我提供的这个例子就是我已经走了多远。是否需要取消引用 lpParameter 指针?或者有没有一种方法可以编辑线程安全的结构?

Example/undesired 代码的输出:

a.val before edit: 5
a.val after edit: 5

Expected/desired 输出(我试图实现的输出):

a.val before edit: 5
a.val after edit: 20

我的总体问题是如何指向 object 结构实例 a 以便我可以在 a 中编辑 a 的成员值= 19 =]线程?

您的代码有两个问题:

  1. 函数 edit_obj 不修改函数 main 的对象 a,而是修改它的一个副本。
  2. 即使#1 已修复,您仍然会有 race condition。调用 CreateThread 后,您无需等待线程完成其工作。因此,根据它是否完成,下面的 printf 行可能会打印出对象的修改或未修改的值。要解决此问题,您必须在线程上调用 WaitForSingleObject

要修复 #1,您可以编写以下内容:

DWORD WINAPI edit_obj(LPVOID *lpParameter) {
   ((object*)lpParameter)->val = 20;

    return 0;
}

要修复 #2,您可以编写以下内容:

int main() {
    [...]

    HANDLE hThread = CreateThread(0, 0, edit_obj, &a, 0, 0);
    WaitForSingleObject( hThread, INFINITE );
    CloseHandle( hThread );
    printf("a.val after edit: %d\n", a.val);

}