Questions tagged «multithreading»

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

13
C ++ volatile关键字是否引入了内存屏障?
我了解这会volatile告知编译器该值可能会更改,但是为了完成此功能,编译器是否需要引入内存隔离墙以使其起作用? 据我了解,对易失对象的操作顺序不能重新排序,必须保留。这似乎意味着需要一些内存隔离,并且实际上没有解决方法。我说的对吗? 有关这个问题有一个有趣的讨论 乔纳森·韦克利(Jonathan Wakely)写道: ...对不同的volatile变量的访问,只要它们出现在单独的完整表达式中,就无法重新排序...对,volatile对于线程安全性是无用的,但并非出于其给出的原因。这不是因为编译器可能会重新排列对易失性对象的访问,而是因为CPU可能会重新排列对易失性对象的访问。原子操作和内存屏障可防止编译器和CPU重新排序 到大卫·施瓦茨回答的评论: 从C ++标准的角度来看,在编译器执行某些操作和编译器发出导致硬件执行某些操作的指令之间没有区别。如果CPU可以重新排序对易失性的访问,则该标准不需要保留其顺序。... ... C ++标准对重新排序没有任何区别。而且您不能说CPU可以对它们进行重新排序而不会产生可观察的效果,所以没关系-C ++标准将它们的顺序定义为可观察的。如果编译器生成使平台执行标准要求的代码,则它符合平台上的C ++标准。如果该标准要求对挥发物的访问不进行重新排序,那么重新排序它们的平台将不兼容。... 我的观点是,如果C ++标准禁止编译器对不同的volatile进行重新排序,那么从理论上讲,此类访问的顺序是程序可观察到的行为的一部分,那么它还要求编译器发出禁止CPU执行的代码所以。该标准没有区分编译器做什么和编译器生成的代码使CPU做什么。 哪个产生两个问题:它们中的一个是“正确的”吗?实际的实现实际上是做什么的?

6
如果内部发生异常,锁定的对象是否保持锁定状态?
在ac#线程应用程序中,如果我要锁定对象,可以说一个队列,如果发生异常,该对象会保持锁定状态吗?这是伪代码: int ii; lock(MyQueue) { MyClass LclClass = (MyClass)MyQueue.Dequeue(); try { ii = int.parse(LclClass.SomeString); } catch { MessageBox.Show("Error parsing string"); } } 据我了解,捕获后的代码无法执行-但我一直在想是否会释放该锁。

6
如何检查std :: thread是否仍在运行?
如何检查astd::thread是否仍在运行(以独立于平台的方式)?它缺少一种timed_join()方法,joinable()并不意味着要这样做。 我曾考虑过std::lock_guard在线程中使用a锁定互斥锁,并使用try_lock()互斥锁的方法来确定它是否仍处于锁定状态(线程正在运行),但是这对我来说似乎不必要。 您知道更优雅的方法吗? 更新:要明确:我想检查线程是否干净退出。为此,一个“挂起”线程被认为正在运行。

4
新线程中的WebBrowser控件
我有一个列表Uri,我想“单击”以实现此目的,我正在尝试为每个Uri创建一个新的Web浏览器控件。我为每个Uri创建一个新线程。我遇到的问题是文档之前的线程结束已完全加载,所以我再也无法利用DocumentComplete事件了,该如何克服呢? var item = new ParameterizedThreadStart(ClicIt.Click); var thread = new Thread(item) {Name = "ClickThread"}; thread.Start(uriItem); public static void Click(object o) { var url = ((UriItem)o); Console.WriteLine(@"Clicking: " + url.Link); var clicker = new WebBrowser { ScriptErrorsSuppressed = true }; clicker.DocumentCompleted += BrowseComplete; if (String.IsNullOrEmpty(url.Link)) return; if (url.Link.Equals("about:blank")) return; if (!url.Link.StartsWith("http://") …

11
如何在C ++ 11中获取整数线程ID
c ++ 11可能会获取当前的线程ID,但是它不能转换为整数类型: cout<<std::this_thread::get_id()<<endl; 输出:139918771783456 cout<<(uint64_t)std::this_thread::get_id()<<endl; 错误:从类型'std :: thread :: id'强制转换为类型'uint64_t'与其他类型相同:从类型'std :: thread :: id'强制转换类型为'uint32_t' 我真的不想做指针转换以获得整数线程ID。有某种合理的方法(因为我希望它是便携式的,所以是标准的)吗?

5
并发字典正确用法
我认为这是正确使用并发字典的意思吗? private ConcurrentDictionary<int,long> myDic = new ConcurrentDictionary<int,long>(); //Main thread at program startup for(int i = 0; i < 4; i++) { myDic.Add(i, 0); } //Seperate threads use this to update a value myDic[InputID] = newLongValue; 我没有锁等,并且即使多个线程可能试图执行相同操作,也只是在更新字典中的值。



5
在线程中使用全局变量
如何与线程共享全局变量? 我的Python代码示例是: from threading import Thread import time a = 0 #global variable def thread1(threadname): #read variable "a" modify by thread 2 def thread2(threadname): while 1: a += 1 time.sleep(1) thread1 = Thread( target=thread1, args=("Thread-1", ) ) thread2 = Thread( target=thread2, args=("Thread-2", ) ) thread1.join() thread2.join() 我不知道如何让两个线程共享一个变量。

4
鉴于jdk1.6及更高版本中的HashMaps导致multi = threading问题,我该如何解决我的代码
我最近在stackoverflow中提出了一个问题,然后找到了答案。最初的问题是,除了互斥锁或垃圾回收以外,还有哪些机制可以减慢我的多线程Java程序的速度? 我惊骇地发现HashMap已在JDK1.6和JDK1.7之间进行了修改。现在,它具有一个代码块,该代码块使所有创建HashMap的线程同步。 JDK1.7.0_10中的代码行是 /**A randomizing value associated with this instance that is applied to hash code of keys to make hash collisions harder to find. */ transient final int hashSeed = sun.misc.Hashing.randomHashSeed(this); 最终打电话 protected int next(int bits) { long oldseed, nextseed; AtomicLong seed = this.seed; do { oldseed = seed.get(); …

4
如何通过辅助线程更新ObservableCollection?
我有一个ObservableCollection<A> a_collection;集合包含“ n”个项目。每个项目A如下所示: public class A : INotifyPropertyChanged { public ObservableCollection<B> b_subcollection; Thread m_worker; } 基本上,所有这些都连接到WPF列表视图+一个详细信息视图控件,该控件b_subcollection在单独的列表视图中显示所选项目的内容(2向绑定,属性更改的更新等)。 当我开始实施线程时,问题就出现了。整个想法是让a_collection工作线程充分利用它来“完成工作”,然后更新各自的工作,b_subcollections并让gui实时显示结果。 当我尝试它时,我得到一个例外,说只有Dispatcher线程可以修改ObservableCollection,并且工作停止了。 谁能解释这个问题,以及如何解决?


5
在主线程上调用方法?
首先,我正在为iPhone编写代码。我需要能够在不使用的情况下在主线程上调用方法performSelectorOnMainThread。我不想使用的performSelectorOnMainThread原因是,当我尝试为单元测试创​​建模拟程序时,它会引起问题。 [self performSelectorOnMainThread:@Selector(doSomething) withObject:nil]; 问题是我的模拟对象知道如何调用,doSomething但不知道如何调用performSelectorOnMainThread。 那么有什么解决办法吗?


15
“使用”语句与“最终尝试”
我有一堆将要使用读/写锁的属性。我可以使用atry finally或using子句实现它们。 在中,try finally我将在之前获取锁,然后在中try释放finally。在该using子句中,我将创建一个在其构造函数中获取锁并在其Dispose方法中释放该锁的类。 我在许多地方都使用了读/写锁,因此我一直在寻找比更为简洁的方法try finally。我很想听听一些关于为什么可能不推荐一种方法,或者为什么一种方法可能比另一种更好的想法。 方法1(try finally): static ReaderWriterLock rwlMyLock_m = new ReaderWriterLock(); private DateTime dtMyDateTime_m public DateTime MyDateTime { get { rwlMyLock_m .AcquireReaderLock(0); try { return dtMyDateTime_m } finally { rwlMyLock_m .ReleaseReaderLock(); } } set { rwlMyLock_m .AcquireWriterLock(0); try { dtMyDateTime_m = value; } finally { rwlMyLock_m .ReleaseWriterLock(); …

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.