在 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 =]线程?
您的代码有两个问题:
- 函数
edit_obj
不修改函数 main
的对象 a
,而是修改它的一个副本。
- 即使#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);
}
我正在尝试在 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 =]线程?
您的代码有两个问题:
- 函数
edit_obj
不修改函数main
的对象a
,而是修改它的一个副本。 - 即使#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);
}