Questions tagged «multithreading»

多线程是计算机或程序通过利用多个并发的执行流(通常称为线程)来并发或异步执行工作的能力。

13
num ++是否可以对“ int num”是原子的?
通常,for int num,num++(或++num)作为读取-修改-写入操作不是原子的。但是我经常看到编译器(例如GCC)为此生成以下代码(请尝试在此处): 由于对应的第5行num++是一条指令,在这种情况下,我们可以得出结论num++ 是原子的吗? 如果是这样,是否意味着这样生成的代码num++可以在并发(多线程)场景中使用,而不会造成数据争用的危险(即,例如,我们不需要这样做,std::atomic<int>并且会产生相关的成本,因为它反正还是原子的? 更新 注意,这个问题不是增量是否是原子的(不是,那过去是,现在是问题的开头)。这是在特定情况下是否可以使用,即在某些情况下是否可以利用单指令性质来避免lock前缀的开销。并且,正如公认的答案在有关单处理器机器的部分中提到的那样,以及该答案,其注释中的对话和其他解释都可以(尽管不是使用C或C ++)。

6
当main()退出时,一个分离的线程会怎样?
假设我先启动一个std::thread,然后启动detach()它,那么即使std::thread那个曾经代表它,但超出范围,线程仍继续执行。 进一步假定该程序不具有用于加入分离线程1的可靠协议,因此分离线程在main()退出时仍然运行。 我无法在标准(更确切地说,在N3797 C ++ 14草案中)中找到任何内容,该标准描述了应该发生的情况,无论1.10还是30.3都没有相关的措辞。 1另一个可能等效的问题是:“是否可以再次连接一个分离的线程”,因为无论您想加入哪种协议,都必须在线程仍在运行时完成信令部分,并且OS调度程序可能决定在执行信令后立即使线程休眠一个小时,而接收端无法可靠地检测到线程实际上已完成。 如果main()用分离的线程运行时耗尽是未定义的行为,则除非主线程永不退出2,否则对的任何使用std::thread::detach()都是未定义的行为。 因此,main()用分离的线程运行时用尽必须具有定义的效果。问题是:在哪里定义了这些效果(在C ++标准中,不是POSIX,不是OS docs,...)。 2分离的线程无法连接(在的意义上std::thread::join())。您可以等待来自分离线程的结果(例如,通过来自的Future std::packaged_task或通过计数信号量或标志和条件变量),但这不能保证线程已完成执行。事实上,除非你把信令部分进入线程的第一个自动对象的析构函数,也将在一般情况下,是代码(析构函数),其运行后的信号代码。如果操作系统安排主线程使用结果并在分离的线程完成运行所述析构函数之前退出,那么将定义发生什么?

9
最佳实践:方向更改期间的AsyncTask
AsyncTask 在另一个线程中运行复杂的任务是一件很棒的事情。 但是,如果AsyncTask仍在运行时发生方向更改或其他配置更改,则电流将Activity被销毁并重新启动。并且由于的实例AsyncTask连接到该活动,因此失败并导致“强制关闭”消息窗口。 因此,我正在寻找某种“最佳实践”来避免这些错误并防止AsyncTask失败。 到目前为止,我所看到的是: 禁用方向更改。(请确保不要使用此方法。) 让任务继续存在并通过以下方式使用新的活动实例对其进行更新 onRetainNonConfigurationInstance 只需在Activity销毁销毁任务时取消该任务,并Activity在再次创建销毁任务时重新启动它即可。 将任务绑定到应用程序类而不是活动实例。 在“货架”项目中使用的某些方法(通过onRestoreInstanceState) 一些代码示例: 屏幕旋转期间的Android AsyncTasks,第一部分和第二部分 ShelvesActivity.java 您能帮助我找到最好的方法,该方法可以最好地解决问题并且也易于实施吗?代码本身也很重要,因为我不知道如何正确解决这个问题。

5
.NET Framework中并发HashSet <T>?
我有以下课程。 class Test{ public HashSet&lt;string&gt; Data = new HashSet&lt;string&gt;(); } 我需要从不同的线程更改字段“数据”,所以我想对当前的线程安全实现提出一些意见。 class Test{ public HashSet&lt;string&gt; Data = new HashSet&lt;string&gt;(); public void Add(string Val){ lock(Data) Data.Add(Val); } public void Remove(string Val){ lock(Data) Data.Remove(Val); } } 有没有更好的解决方案,可以直接进入现场并保护它免受多个线程的并发访问?


6
何时使用enumerateObjectsUsingBlock与
除了明显的区别: 使用enumerateObjectsUsingBlock时,你既需要索引和对象 enumerateObjectsUsingBlock当您需要修改局部变量时不要使用(我错了,请参见bbum的答案) 被enumerateObjectsUsingBlock普遍认为是好还是坏的时候for (id obj in myArray)也会工作?优点/缺点是什么(例如,或多或少的性能)?

5
锁定未锁定的互斥锁的效率如何?互斥锁的成本是多少?
在低级语言(C,C ++或任何其他语言)中:我可以选择是否拥有一堆互斥对象(例如pthread给我的东西或本机系统库提供的东西)或一个对象的单个对象。 锁定互斥锁的效率如何?即可能有多少个汇编程序指令,它们需要多少时间(在互斥锁未锁定的情况下)? 互斥锁的成本是多少?确实有很多互斥体是一个问题吗?还是我可以在代码中抛出与变量一样多的互斥量int变量,这并不重要吗? (我不确定不同的硬件之间有多少区别。如果有,我也想知道它们。但是大多数情况下,我对通用硬件很感兴趣。) 关键是,通过使用许多互斥量(每个互斥量仅覆盖对象的一部分)而不是整个对象的单个互斥量,我可以保护很多块。我想知道我应该走多远。即我应该尽可能真正地保护任何可能的块,无论这意味着多少复杂和多少互斥量? WebKits博客文章(2016)中有关锁定的问题与该问题非常相关,并解释了自旋锁,自适应锁,futex等之间的区别。


5
如果非同步静态方法不修改静态类变量,它们是否安全?
我在想,如果您有一个静态方法不同步,但并没有修改任何静态变量是线程安全的?如果该方法在其中创建局部变量该怎么办?例如,以下代码是线程安全的吗? public static String[] makeStringArray( String a, String b ){ return new String[]{ a, b }; } 因此,如果我有两个线程连续并同时调用此方法,一个带狗(例如“大丹狗”和“斗牛犬”),另一个带猫(例如“波斯”和“暹罗”)的猫,我将得到猫和狗在同一阵列中?还是猫和狗永远不会同时处于该方法的同一调用中?


11
等待未来的清单
我有一种返回List期货的方法 List&lt;Future&lt;O&gt;&gt; futures = getFutures(); 现在,我要等到所有期货都成功完成处理,或者期货输出返回的任何任务都抛出异常。即使一项任务引发异常,也没有必要等待其他期货。 简单的方法是 wait() { For(Future f : futures) { try { f.get(); } catch(Exception e) { //TODO catch specific exception // this future threw exception , means somone could not do its task return; } } } 但是这里的问题是,例如,如果第4个期货抛出异常,那么我将不必要地等待前3个期货可用。 如何解决呢?会以任何方式倒计时闩锁帮助吗?我无法使用Future,isDone因为Java文档说 boolean isDone() Returns true if this …

26
尝试读取或写入受保护的内存。这通常表明其他内存已损坏
我希望有人能启发我有关可能导致此错误的原因: 尝试读取或写入受保护的内存。这通常表明其他内存已损坏。 我无法真正发布代码,因为此错误似乎在应用程序的任何随机区域中引发。该应用程序将在引发错误之前的12-48小时内运行。有时它会在看似随机的位置停止并引发上述错误,而其他时候整个应用程序都停止了,并且我得到一个屏幕错误,该错误的内容大致上是“ ...中存在致命错误……这可能是CLR中的错误或...”有关PInvoke的信息或其他不相关的信息。发生这种情况时,所有线程均显示已终止,并且没有可用的调试信息。 简而言之,这就是应用程序的作用: 它是一个完全用C#编写的多线程服务器应用程序。客户端通过套接字连接到服务器。服务器为客户端运行一个虚拟的“环境”,使客户端可以相互与环境进行交互。它消耗了大量内存,但我看不到它在泄漏。它通常消耗约1.5GB。我不认为其泄漏是因为在整个应用程序运行期间内存使用率保持相对恒定。即使客户没有做任何事情,它仍在不断运行的代码可以维护环境。它不使用任何第三方软件或其他API。此应用程序使用的唯一外部资源是套接字连接和SQL数据库连接。它运行在64位服务器上。我已经尝试使用.net 2.0、3.5和4在VS2008和VS2010中对此进行调试。 我尝试关闭编译器优化和几个Microsoft修补程序。似乎没有什么可以解决这个问题。如果有人知道任何可能的原因,或某种方式识别导致问题的原因,将不胜感激。

3
Parallel.ForEach()与foreach(IEnumerable <T> .AsParallel())
抱歉,我正在尝试使用Reflector在BCL中找到这两种方法,但找不到它们。这两个摘要有什么区别? A: IEnumerable&lt;string&gt; items = ... Parallel.ForEach(items, item =&gt; { ... }); B: IEnumerable&lt;string&gt; items = ... foreach (var item in items.AsParallel()) { ... } 相互使用会产生不同的后果吗?(假设我在两个示例的方括号中所做的任何操作都是线程安全的。)

11
“ Java DateFormat不是线程安全的”这会导致什么?
每个人都对Java DateFormat并不是线程安全的警告,我从理论上理解了这个概念。 但是我无法想象由此导致的实际问题。假设我在一个类中有一个DateFormat字段,并且在多线程环境中该类的不同方法(格式化日期)中使用了相同的字段。 这会导致: 任何异常,例如格式异常 数据差异 还有其他问题吗? 另外,请解释原因。


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.