在 LabWindows/CVI 中使用 ThreadSafe 变量宏
Using ThreadSafe variable macros in LabWindows/CVI
我在 LabWindows/CVI 环境中使用 thread safe variable 宏并且观察到有可能在释放之前获取指向线程安全变量的指针。 (来自之前的请求)
因为我想保护的数据是 struct
,我无法明确设置嵌套级别,所以我假设嵌套级别保持在 0,即一旦单个线程安全指针具有发出后,第二个请求将被拒绝,直到第一个被释放。但是,我在逐步调试会话时观察到这不是真的。通过继续使用 F8 step-into 键继续执行 DefineThreadSafeVar(CLI, SafeCli);
语句,随后请求指向 thread-safe[=33] =] 变量在没有发布原始变量的情况下被授予。
我的期望是这些宏应该阻止访问线程安全变量一旦指向它的指针已发出但尚未释放。
我的期望不正确吗?
还是我调用的方式不正确?
这是我的源代码:
#include <utility.h>
typedef struct {
int hndl;
int connect;
int sock;
}CLI;
DefineThreadSafeVar(CLI, SafeCli);
void func1(void);
void func2(void);
int main(void)
{
InitializeSafeCli();
func1();
return 0;
}
void func1(void)
{
CLI *safe;
safe = GetPointerToSafeCli();//original issue
safe->connect = 2;
safe->hndl = 3;
safe->sock = 4;
func2();
safe->connect;
safe->hndl;
safe->sock;
ReleasePointerToSafeCli();
}
void func2(void)
{
CLI *safe;
safe = GetPointerToSafeCli();//request is granted. previous issue had not been released.
//shouldn't request have been denied ?
safe->connect = 5;//variable is modified.
safe->hndl = 6;
safe->sock = 7;
}
在您的情况下,您在 func1()
中调用 func2()
,随后在同一个调用堆栈中,因此在同一个线程中。您被授予访问权限,因为您正在从已经可以访问指针的同一线程中请求指针。
GetPointerToSafeCli()
是等待呼叫。如果在线程 A 中调用 ReleasePointerToSafeCli()
之前从线程 A 调用它,然后在线程 B 中再次调用它,则线程 B 将等到指针被释放后再授予访问权限。
我在 LabWindows/CVI 环境中使用 thread safe variable 宏并且观察到有可能在释放之前获取指向线程安全变量的指针。 (来自之前的请求)
因为我想保护的数据是 struct
,我无法明确设置嵌套级别,所以我假设嵌套级别保持在 0,即一旦单个线程安全指针具有发出后,第二个请求将被拒绝,直到第一个被释放。但是,我在逐步调试会话时观察到这不是真的。通过继续使用 F8 step-into 键继续执行 DefineThreadSafeVar(CLI, SafeCli);
语句,随后请求指向 thread-safe[=33] =] 变量在没有发布原始变量的情况下被授予。
我的期望是这些宏应该阻止访问线程安全变量一旦指向它的指针已发出但尚未释放。
我的期望不正确吗?
还是我调用的方式不正确?
这是我的源代码:
#include <utility.h>
typedef struct {
int hndl;
int connect;
int sock;
}CLI;
DefineThreadSafeVar(CLI, SafeCli);
void func1(void);
void func2(void);
int main(void)
{
InitializeSafeCli();
func1();
return 0;
}
void func1(void)
{
CLI *safe;
safe = GetPointerToSafeCli();//original issue
safe->connect = 2;
safe->hndl = 3;
safe->sock = 4;
func2();
safe->connect;
safe->hndl;
safe->sock;
ReleasePointerToSafeCli();
}
void func2(void)
{
CLI *safe;
safe = GetPointerToSafeCli();//request is granted. previous issue had not been released.
//shouldn't request have been denied ?
safe->connect = 5;//variable is modified.
safe->hndl = 6;
safe->sock = 7;
}
在您的情况下,您在 func1()
中调用 func2()
,随后在同一个调用堆栈中,因此在同一个线程中。您被授予访问权限,因为您正在从已经可以访问指针的同一线程中请求指针。
GetPointerToSafeCli()
是等待呼叫。如果在线程 A 中调用 ReleasePointerToSafeCli()
之前从线程 A 调用它,然后在线程 B 中再次调用它,则线程 B 将等到指针被释放后再授予访问权限。