首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在LabWindows/CVI中使用ThreadSafe变量宏

在LabWindows/CVI中使用ThreadSafe变量宏
EN

Stack Overflow用户
提问于 2015-08-24 15:58:22
回答 1查看 363关注 0票数 1

我在LabWindows/CVI环境中使用http://www.ni.com/white-paper/3663/en/宏,并且观察到在释放线程安全变量之前可以获得一个指向它的指针。(来自先前的请求)

因为我对保护感兴趣的数据是struct,所以我无法显式设置嵌套级别,因此我假设嵌套级别保持在0,也就是说,一旦发出了单个线程安全指针,第二个请求将被拒绝,直到第一个线程被释放。但是,我注意到在调试会话过程中,这并不是真的。通过DefineThreadSafeVar(CLI, SafeCli);语句继续执行,方法是继续使用F8步骤进入键,随后对指向线程安全变量的指针的请求将在没有释放原始变量的情况下被批准。

我的期望是,一旦发出指向线程安全变量的指针而尚未释放时,这些宏应该阻止对它的访问。

我的期望是错误的吗?

还是我没有正确地实现这些调用?

这是我的源代码:

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-04 18:24:43

在您的示例中,您正在func1()中调用func1(),随后在相同的调用堆栈中,因此在相同的线程中。授予您访问权限,因为您是从已经访问该指针的同一个线程中请求指针的。

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

LabWindows/CVI -用DefineThreadSafeScalarVar编程

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32186689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档