来自boost的Thread本地存储的意外行为

时间:2015-04-30 09:33:29

标签: c++ boost

我使用boost的线程本地存储。

SolutionA tls.h中的extern __declspec(dllexport) boost::thread_specific_ptr<int> ThreadLocalStorage; (dll):

tls.cpp

在同一解决方案中,但在__declspec(dllexport) boost::thread_specific_ptr<int> ThreadLocalStorage; 中:

SolutionB

file.pp __declspec(dllimport) boost::thread_specific_ptr<int> ThreadLocalStorage; 中的ThreadLocalStorage(dll):

SolutionB

这一切都有问题。

但是在运行时我尝试更改reset_Block_Type_Is_Valid (pHead->nBlockUse) Error 的值以及我声明的release函数:

reset

现在我可以通过在SolutionA之前调用ThreadLocalStorage来解决这个问题,但是当我从此函数返回ThreadLocalStorage并尝试获取#include <boost/thread/tss.hpp> namespace threads { extern __declspec(dllexport) boost::thread_specific_ptr<int> TlsStorage; extern __declspec(dllexport) int tls_value_storage = 0; } 时,我会看到一些随机值。

我似乎有#include <Include/ThreadLocalStorage.h> namespace threads { __declspec(dllexport) boost::thread_specific_ptr<int> TlsStorage; extern __declspec(dllexport) int tls_value_storage; } 的2个不同实例,我该如何解决这个问题?

@Edit:这是多个TLS实例的问题,而不是从dll导出/导入的。

我试着总结一切:

我尝试导出线程本地存储(dllexport) 来自firstmodule并导入secondmodule(dllimport)但没有效果。在firstmodule我有包含/ ThreadLocalStorage.h和delaration:

namespace threads {

                           extern __declspec(dllimport) boost::thread_specific_ptr<int> TlsStorage;
                           extern __declspec(dllimport) int tls_value_storage2;
}

整数tls_value_storage仅用于测试目的。还有Src / ThreadLocalStorage.cpp:

            threads::TlsStorage.reset(&new_language_value);
            int *sanity_check = threads::TlxStorage.get();  //.get() return proper value


            Funtion();

和最后一个:在second模块模块中的stdafx.h中:

            int sanity_check_1 = threads::tls_value_storage; //Proper value
            int *sanity_check_2 = threads::TlsStorage.get(); // Something bad happens, return uninitialized tls

但毕竟当我尝试在secondmodule

中更改set tls时
error LNK2001: unresolved external symbol "__declspec(dllimport) class boost::thread_specific_ptr<int> threads::TlsStorage" (__imp_?TlsStorage@threads@tlx@@3V?$thread_specific_ptr@H@boost@@A)

现在我们转到firstmodule,function()(使用相同的线程)

library(data.table)#v >= 1.9.5 (devel version - install from GitHub).
#library(devtools)
#install_github("Rdatatable/data.table", build_vignettes = FALSE)
as.data.table(example)[, res:=(NA | (min(example)< -1))*example, by=rleid(is.na(example))][, res]

我认为在__declspec(dllexport)boost :: thread_specific_ptr TlsStorage之前可能是缺少extern的错 在ThreadLoalStorage.cpp中但是当我添加“extern”时,我有:

{{1}}

在编译过程中。也许这是一个问题吗?

0 个答案:

没有答案