在LabWindows / CVI中使用ThreadSafe变量宏

时间:2015-08-24 15:58:23

标签: thread-safety cvi labwindows

我在LabWindows / CVI环境中使用 thread safe variable 宏,并观察到可以在之前获取指向线程安全变量的指针它已被释放。 (根据之前的要求)

因为我在保护中感兴趣的数据是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;
}

1 个答案:

答案 0 :(得分:2)

在您的情况下,您在func2()内调用func1(),然后在相同的调用堆栈内,因此是相同的线程。您已获得访问权限,因为您从已有权访问指针的同一线程中请求指针。

GetPointerToSafeCli()是一个等待电话。如果在线程A中调用ReleasePointerToSafeCli()之前从线程A调用然后再在线程B中调用它,则线程B将等到指针被释放后才授予访问权限。

LabWindows/CVI - Programming with DefineThreadSafeScalarVar