我想知道如果你有一个不同步的静态方法,但不修改任何静态variables是线程安全的吗? 那么如果方法里面创build了局部variables呢? 例如,下面的代码是线程安全的吗? public static String[] makeStringArray( String a, String b ){ return new String[]{ a, b }; } 所以如果我有两个线程连续地,同时地调用这个方法,那么一个与狗(称为“大丹犬”和“公牛狗”)和另一个与猫(称为“波斯”和“暹罗语”),我会得到猫和狗在同一个数组? 或者,猫狗不会同时在同一个方法的调用中?
单身类的通常模式是类似的 static Foo &getInst() { static Foo *inst = NULL; if(inst == NULL) inst = new Foo(…); return *inst; } 然而,我的理解是这个解决scheme不是线程安全的,因为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时,inst始终保证为NULL?
假设我有一个N个元素的向量,但是这个向量的n个元素都有有意义的数据。 一个更新程序线程更新第n个或第n + 1个元素(然后设置n = n + 1),还检查n是否太接近于N,并在必要时调用vector :: resize(N + M)。 更新之后,线程调用多个子线程读取第n个数据并进行一些计算。 确保子线程永远不会更改或删除数据(实际上没有数据被删除),更新程序在完成更新后立即调用子线程。 到目前为止,没有发生任何问题,但是我想问一下如果在上一次更新之前还有一些子工作线程,向量重新分配给更大的内存块时是否会出现问题。 或者在这种multithreading的情况下使用向量是安全的,因为它不是线程安全的? 编辑:因为只有插入发生时更新调用vector::resize(N + M,0),有没有任何可能的解决scheme,我的问题? 由于STL向量的良好性能,我不愿意用一个可locking向量来replace它,或者在这种情况下是否有任何高性能,已知和无锁向量?
我想为实验创build一个非线程安全的代码块,这些是2个线程将要调用的函数。 c = 0 def increment(): c += 1 def decrement(): c -= 1 这个代码线程安全吗? 如果没有,我可以理解为什么它不是线程安全的,哪种语句通常会导致非线程安全的操作。 如果它是线程安全的,我怎样才能使它显式非线程安全?
我正在阅读Java中的multithreading,并且遇到了这个问题 Java中的局部variables是线程安全的。 从那以后,我一直在想如何/为什么局部variables是线程安全的。 有人可以让我知道。
这是C#的一个细节问题。 假设我有一个对象的类,并且该对象受锁的保护: Object mLock = new Object(); MyObject property; public MyObject MyProperty { get { return property; } set { property = value; } } 我想要一个轮询线程能够查询该属性。 我还希望线程偶尔更新该对象的属性,有时用户可以更新该属性,并且用户希望能够看到该属性。 以下代码是否会正确locking数据? Object mLock = new Object(); MyObject property; public MyObject MyProperty { get { lock (mLock){ return property; } } set { lock (mLock){ property = value; } […]
我想知道哪些是停止Android中的线程的最好方法。 我知道我可以使用AsyncTask而不是它,并且有cancel()方法。 我必须在我的情况下使用线程。 这里是我如何使用线程: Runnable runnable = new Runnable() { @Override public void run() { //doing some work } }; new Thread(runnable).start(); 所以任何人有任何想法是停止线程的最好方法?
假设我们在一个QObject派生类中写了一个非const方法: class MyClass : public QObject { int x; public: void method(int a) { x = a; // and possibly other things }; }; 我们想让这个方法是线程安全的:意味着从一个任意的线程和多个线程同时调用它,不应该引入未定义的行为。 Qt提供哪些机制/ API来帮助我们使这个方法成为线程安全的? 当方法执行“其他事情”时,来自Qt的什么机制/ API可以使用? 是否有任何分类可能的“其他事情”,可以告诉什么Qt特定的机制/ API使用? 脱离主题是由C ++标准本身提供的机制,以及确保线程安全的通用/非Qt特定方法。
我正在寻找有关urllib2和httplib的线程安全性的信息。 官方文档( http://docs.python.org/library/urllib2.html和http://docs.python.org/library/httplib.html )缺less关于此主题的任何信息; 字线甚至没有提到那里… UPDATE 好的,它们不是线程安全的。 需要什么使它们成为线程安全的,或者是否有一种可以线程安全的scheme? 我问,因为这似乎是 在每个线程中使用单独的OpenerDirector 不在线程之间共享HTTP连接 足以安全地在线程中使用这些库。 问题urllib2和cookielib线程安全性提出了类似的使用情况
考虑x86 CPU上的单个内存访问(单次读取或单次写入,而不是读取+写入)SSE指令。 该指令访问16个字节(128位)的内存,访问的内存位置alignment到16个字节。 文档“英特尔®64架构内存订购白皮书”指出,对于“读取或写入地址在8字节边界上alignment的四字(8字节)的指令”,内存操作似乎作为单个内存访问执行,而不pipe内存types。 问题: 是否存在保证读取或写入16字节边界的16字节(128位)作为单个存储器访问的Intel / AMD / x86 x86 CPU? 是这样的,哪种types的CPU是它(Core2 / Atom / K8 / Phenom / …)? 如果您对这个问题提供了答案(是/否), 还请指定用于确定答案的方法 – PDF文档查找,powershelltesting,mathcertificate或您用来确定答案的任何其他方法。 这个问题涉及到诸如http://research.swtch.com/2010/02/off-to-races.html之类的问题 更新: 我用C语言创build了一个简单的testing程序,你可以在你的电脑上运行。 请在您的Phenom,Athlon,Bobcat,Core2,Atom,Sandy Bridge或任何具有SSE2function的CPU上进行编译和运行。 谢谢。 // Compile with: // gcc -oa ac -pthread -msse2 -std=c99 -Wall -O2 // // Make sure you have at least two physical CPU cores […]