在后台线程上更新业务对象的集合时,我收到以下错误消息:
这种类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection.
好的,这是有道理的.但它也引出了一个问题,什么版本的CollectionView支持多个线程,如何让我的对象使用它?
单身类的通常模式就像
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
inst = new Foo(...);
return *inst;
}
Run Code Online (Sandbox Code Playgroud)
但是,我的理解是这个解决方案不是线程安全的,因为1)Foo的构造函数可能被多次调用(可能或可能不重要)和2)inst在返回到不同的线程之前可能没有完全构造.
一种解决方案是围绕整个方法包装一个互斥锁,但是在我真正需要它之后很长时间我就要付出同步开销.另一种选择是
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
{
pthread_mutex_lock(&mutex);
if(inst == NULL)
inst = new Foo(...);
pthread_mutex_unlock(&mutex);
}
return *inst;
}
Run Code Online (Sandbox Code Playgroud)
这是正确的做法,还是我应该注意哪些陷阱?例如,是否存在可能发生的静态初始化顺序问题,即在第一次调用getInst时,inst总是保证为NULL?
我编写了一个简单的多线程程序,如下所示:
static bool finished = false;
int func()
{
size_t i = 0;
while (!finished)
++i;
return i;
}
int main()
{
auto result=std::async(std::launch::async, func);
std::this_thread::sleep_for(std::chrono::seconds(1));
finished=true;
std::cout<<"result ="<<result.get();
std::cout<<"\nmain thread id="<<std::this_thread::get_id()<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它通常表现在调试模式下在Visual Studio中或-O0
在GC c和后打印出的结果1
秒钟。但是它卡住了,在“ 释放”模式或中不打印任何内容-O1 -O2 -O3
。
我写了一个类和许多单元测试,但我没有让它线程安全.现在,我想让类线程安全,但为了证明它并使用TDD,我想在开始重构之前编写一些失败的单元测试.
有什么好办法吗?
我的第一个想法是创建一些线程并让它们以不安全的方式使用该类.用足够的线程做足够的时间,我一定会看到它破裂.
重新解释一下这个问题:我应该避免共享java.sql.Connection
在不同线程之间实现的类的实例吗?
Spring是否是RestTemplate
线程安全的?那是
RestTemplate
多个连接可以安全共享的策略对象.要么RestTemplate
连接对象(如数据库连接),在使用时无法共享,并且需要为每个连接重新创建或池化.在示例代码中
void foo()
{
static Bar b;
...
}
Run Code Online (Sandbox Code Playgroud)
使用GCC编译是否可以保证b
以线程安全的方式创建和初始化?
在gcc的手册页中,找到了-fno-threadsafe-statics命令行选项:
不要发出额外的代码来使用C++ ABI中指定的例程来进行本地静态的线程安全初始化.您可以使用此选项在不需要线程安全的代码中略微减小代码大小.
这是否意味着,默认情况下,GCC的本地静态是线程安全的?所以没有理由明确保护,例如pthread_mutex_lock/unlock
?
如何编写可移植代码 - 如何检查编译器是否会添加其防护?或者关闭GCC的这个功能是否更好?
很简单,可以从多个线程中使用javax.crypto.Cipher
(例如Cipher.getInstance("RSA")
)一个实例,还是需要在ThreadLocal
(在我的情况下)将多个实例中的多个实例中使用?
我认为线程安全,特别是意味着它必须满足多线程访问相同共享数据的需要.但是,似乎这个定义还不够.
任何人都可以列出要完成或处理的事情,以使应用程序线程安全.如果可能的话,给出一个关于C/C++语言的答案.
thread-safety ×10
c++ ×4
java ×4
.net ×2
c ×1
c# ×1
concurrency ×1
data-race ×1
date-format ×1
dbconnection ×1
encryption ×1
gcc ×1
jdbc ×1
jodatime ×1
nunit ×1
pthreads ×1
rest ×1
singleton ×1
spring ×1
static ×1
unit-testing ×1
wpf ×1