Questions tagged «thread-safety»

如果一段代码仅以允许多个线程一致地执行此代码的方式操作数据结构,则它是线程安全的。代码可能是线程安全的,有条件的安全(需要互斥)或不安全的(只能由一个线程安全使用)。

3
线程安全与可重入
最近,我问了一个问题,标题为“ malloc线程安全吗?” ,然后在里面问:“ malloc是否可重入?” 我的印象是所有重入者都是线程安全的。 这个假设错了吗?

3
lock(new object())—货物崇拜还是某种疯狂的“语言特殊情况”?
我正在审查由顾问编写的一些代码,虽然已经弹出了许多危险信号,但我无法将头包裹在以下代码片段中: private void foo() { if (InvokeRequired) { lock (new object()) { if (m_bar!= null) Invoke(new fooDelegate(foo), new object[] { }); } } else { if(OnBazChanged != null) OnBazChanged(); } } lock(new object())在这里做什么?因为它总是锁定在另一个对象上,所以应该没有任何作用,但是这种锁定在整个代码中都是持久的,即使在未复制粘贴的部分中也是如此。这是C#语言中的某种特殊情况,被编译成我不知道的东西吗?还是程序员只是采用了一些前一段时间发生的工作?


4
Rails中Thread.current []使用的安全性
我对在Thread.current哈希表中存储信息的做法(例如current_user,当前子域等)的看法一直存在分歧。已经提出了将该技术作为简化模型层中的后续处理(查询范围,审计等)的一种方法。 为什么我的线程变量在Rails中是间歇性的? 在Rails的API包装器中使用Thread.current的替代方法 Thread.current []值和类级别属性是否可以在Rails中安全使用? 许多人认为这种做法不可接受,因为它破坏了MVC模式。其他人则对这种方法的可靠性/安全性表示担忧,而我的两部分问题主要针对后者。 Thread.current在整个周期中,是否保证哈希可以对一个且只有一个响应可用并且是私有的? 我了解到,在响应结束时,线程很可能会移交给其他传入请求,从而泄漏存储在中的任何信息Thread.current。在响应结束之前清除此类信息(例如通过Thread.current[:user] = nil从控制器执行after_filter)是否足以防止此类安全漏洞? 谢谢!朱塞佩


14
Android-停止线程的最佳安全方法
我想知道哪种是停止Android中线程的最佳方法。我知道我可以AsyncTask代替它,并且有一种cancel()方法。我必须Thread在我的情况下使用。这是我的使用方式Thread: Runnable runnable = new Runnable() { @Override public void run() { //doing some work } }; new Thread(runnable).start(); 那么,有谁知道停止线程的最佳方法是什么?

9
C ++中高效的线程安全单例
单例课程的通常模式如下 static Foo &getInst() { static Foo *inst = NULL; if(inst == NULL) inst = new Foo(...); return *inst; } 但是,据我了解,此解决方案不是线程安全的,因为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; } 这是正确的方法,还是我应该注意的陷阱?例如,是否可能发生任何静态初始化顺序问题,即inst总是在首次调用getInst时始终保证为NULL?

3
如何创建运行STA线程的任务(TPL)?
使用线程非常简单 Thread thread = new Thread(MethodWhichRequiresSTA); thread.SetApartmentState(ApartmentState.STA); 如何在WPF应用程序中使用“任务”完成相同任务?这是一些代码: Task.Factory.StartNew ( () => {return "some Text";} ) .ContinueWith(r => AddControlsToGrid(r.Result)); 我收到一个InvalidOperationException与 调用线程必须是STA,因为许多UI组件都需要STA。


6
如何确保实用程序静态方法的线程安全?
是否可以通过任何常规方法或规则来确保专门用于任何应用程序的各种Utility类的静态方法的线程安全性。在这里,我想特别指出Web应用程序的线程安全性。 众所周知,以不可变对象作为参数的静态方法是线程安全的,而可变对象不是。 如果我有一个实用程序方法可用于的某种操作,java.util.Date并且该方法接受的实例java.util.Date,则该方法将不是线程安全的。那么如何在不更改参数传递方式的情况下使其成为线程安全的呢? public class DateUtils { public static Date getNormalizeDate(Date date) { // some operations } } 课堂也是javax.faces.context.FacesContext可变的吗?将此类的实例传递给此类静态实用程序方法是否安全? 这个类的列表可能很长;这些实例的实例可以作为参数或不能作为参数传递。那么在编写此类实用程序类的代码时我们应牢记哪些要点?

4
RestTemplate线程安全吗?
Spring是RestTemplate线程安全的吗?那是 是RestTemplate可以安全共享多个连接的策略对象。要么 是一个RestTemplate连接对象(如数据库连接),使用时无法共享,并且需要为每个连接重新创建或池化。

3
多线程程序停留在优化模式下,但在-O0下正常运行
我编写了一个简单的多线程程序,如下所示: 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; } 它通常表现在调试模式下在Visual Studio中或-O0在GC c和后打印出的结果1秒钟。但是它卡住了,在“ 释放”模式或中不打印任何内容-O1 -O2 -O3。


9
单元测试的线程安全性?
我已经编写了一个类和许多单元测试,但没有使它成为线程安全的。现在,我想使类线程安全,但是要证明它并使用TDD,我想在开始重构之前编写一些失败的单元测试。 有什么好办法吗? 我的第一个想法就是创建几个线程,并使它们全部以不安全的方式使用该类。用足够的线程执行此操作足够的时间,我一定会看到它破裂。

3
“ volatile”对于多核系统的可移植C代码是否有任何保证?
看着经过一大堆 的 其他 问题 和 他们的 答案,我得到的印象是有什么在C“挥发性”关键字表示正好没有广泛的协议。 即使标准本身似乎也不够清晰,每个人都无法理解其含义。 除其他问题外: 根据您的硬件和编译器,它似乎提供了不同的保证。 它影响编译器优化,但不影响硬件优化,因此在执行自己的运行时优化的高级处理器上,甚至不清楚编译器是否可以阻止您要阻止的任何优化。(某些编译器确实会生成指令来阻止某些系统上的某些硬件优化,但这似乎并未以任何方式进行标准化。) 总结一下问题,似乎(经过大量阅读)“ volatile”保证了类似的结果:该值将不但从/向寄存器,而且至少向内核的L1缓存中读/写,其顺序与读/写出现在代码中。但这似乎没有用,因为在同一个线程中读/写寄存器已经足够,而与L1缓存协调并不能保证与其他线程的协调。我无法想象仅与L1缓存进行同步的重要性。 用途1 唯一广泛同意使用volatile的似乎是旧的或嵌入式系统,其中某些内存位置通过硬件映射到I / O功能,例如内存中的某个位(直接在硬件中)控制灯光。 ,或告诉您键盘按键是否按下的内存中的某个位(因为它是通过硬件直接连接到按键的)。 看来,“用1”不移植的代码,其目标包括多核系统发生。 USE 2 与“ use 1”没什么不同,它是可由中断处理程序(可以控制灯光或从键存储信息)随时读取或写入的内存。但是为此已经存在一个问题,即取决于系统,中断处理程序可能会在 具有自己的内存缓存的不同内核上运行,并且“ volatile”不能保证所有系统上的缓存一致性。 因此,“使用2”似乎超出了“易失性”所能提供的范围。 用途3 我看到的唯一其他无可争议的用途是防止通过不同变量指向指向编译器未意识到的相同内存的不同内存的访问优化。但这可能只是无可争议的,因为人们没有在谈论它-我只看到其中一个提及。而且我认为C标准已经认识到“不同”的指针(例如指向函数的不同args)可能指向同一项目或附近的项目,并且已经指定编译器必须生成即使在这种情况下也可以工作的代码。但是,我无法在最新的标准(500页!)中快速找到此主题。 那么“使用3”也许根本不存在? 因此,我的问题是: 在多核系统的可移植C代码中,“ volatile”是否完全可以保证? 编辑-更新 浏览最新标准后,答案似乎至少是非常有限的: 1.标准针对特定类型“ volatile sig_atomic_t”反复指定特殊处理。但是该标准还说,在多线程程序中使用信号功能会导致不确定的行为。因此,该用例似乎仅限于单线程程序与其信号处理程序之间的通信。 2.该标准还为setjmp / longjmp指定了“ volatile”的明确含义。(在其他问题和答案中给出了重要示例代码)。 因此,更精确的问题变成了: 除了(1)允许单线程程序从其信号处理程序接收信息之外,还是(2)允许setjmp,“ volatile”是否可以保证多核系统的可移植C代码中的任何内容?代码以查看在setjmp和longjmp之间修改的变量? 这仍然是一个是/否问题。 如果为“是”,那么最好显示一个无错误的可移植代码示例,如果省略了“ volatile”,则该示例会出现错误。如果为“ no”,那么我认为对于多核目标,在这两种非常特殊的情况下,编译器可以随意忽略“ volatile”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.