我在LabWindows/CVI环境中使用线程安全变量宏,并观察到有可能在线程安全变量被释放之前获得指针。(来自上一个请求)
因为我感兴趣的保护数据是struct
,我无法显式设置嵌套级别,所以我假设嵌套级别保持在0,即一旦发出单个线程安全指针,第二个请求将被拒绝,直到第一个被释放。然而,在调试会话中,我观察到这不是真的。通过继续使用F8 步进键,继续执行DefineThreadSafeVar(CLI, SafeCli);
语句,随后对指向线程安全变量的指针的请求被授予,而无需释放原始变量。
我的期望 是,这些宏应该阻止访问一个线程安全的变量,一旦指针已经发出,还没有释放。
我的期望不正确吗?
或者我是否错误地实现了调用?
我的源代码:
#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 - DefineThreadSafeScalarVar编程