我正在使用旋转锁来保护非常小的关键部分。 争用很less发生,所以自旋锁比普通的互斥锁更合适。 我现在的代码如下,并假定x86和GCC: volatile int exclusion = 0; void lock() { while (__sync_lock_test_and_set(&exclusion, 1)) { // Do nothing. This GCC builtin instruction // ensures memory barrier. } } void unlock() { __sync_synchronize(); // Memory barrier. exclusion = 0; } 所以我想知道: 这段代码是否正确? 它是否正确确保相互排斥? 它是否适用于所有x86操作系统? 它也可以在x86_64上运行吗? 在所有操作系统上? 这是最佳的吗? 我已经看到使用比较和交换的自旋锁实现,但我不知道哪个更好。 根据GCCprimefacesbuild立的文档( http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html )还有__sync_lock_release 。 我不是内存障碍方面的专家,所以我不确定是否可以使用这个来代替__sync_synchronize 。 我正在优化的情况下,没有争议。 我根本不在意争论。 […]
我和同事一起编写运行在x86,x64,Itanium,PowerPC和其他10年历史的服务器CPU上的各种平台的软件。 我们只讨论了pthread_mutex_lock(),pthread_mutex_unlock()等互斥函数是否足够,或者被保护的variables是否需要变化。 int foo::bar() { //… //code which may or may not access _protected. pthread_mutex_lock(m); int ret = _protected; pthread_mutex_unlock(m); return ret; } 我关心的是caching。 编译器是否可以在堆栈或寄存器中放置_protected的副本,并在赋值中使用陈旧的值? 如果不是,什么阻止了这种情况发生? 这种模式的变化是脆弱的吗? 我认为编译器实际上并不知道pthread_mutex_lock()是一个特殊的函数,所以我们只是通过序列点保护? 非常感谢。 更新:好的,我可以看到一个趋势与解释为什么波动是不好的。 我尊重这些答案,但关于这个问题的文章很容易在网上find。 我在网上找不到的东西,也是我问这个问题的原因,就是我没有变化的保护。 如果上面的代码是正确的, 那么对于caching问题怎么办?
在Linux上有什么简单的方法在Python上进行系统互斥? “系统范围”是指一组Python 进程使用互斥锁; 这与传统的互斥体形成对比,传统的互斥体在同一过程中被一组线程所使用。 编辑:我不知道Python的multiprocessing包是我所需要的。 例如,我可以在两个不同的解释器中执行以下操作: from multiprocessing import Lock L = Lock() L.acquire() 当我在两个单独的解释器中同时执行这些命令时,我想让其中一个挂起。 相反,两者都没有挂起。 看起来他们并没有获得相同的互斥量。
我有点困惑如何使用pthread声明一个recursion互斥。 我试图做的是一次只能有一个线程能够运行一段代码(包括函数),但是在怀疑之后,我发现互斥锁的使用将不起作用,而我应该使用recursion互斥体(recursive mutexes)。 这是我的代码: pthread_mutex_lock(&mutex); // LOCK item = queue_peek(queue); // get last item in queue item_buff=item; // save item to a buffer queue_removelast(queue); // remove last item from queue pthread_mutex_unlock(&mutex); // UNLOCK 所以我试图做的只是连续读取/从队列中删除。 关于如何声明recursion互斥体,没有任何例子。 或者也许有一些,但他们不为我编译。
我开始在Python中的multithreading(或者至less有可能是我的脚本创build多个线程)。 这个algorithm会是一个互斥量的正确用法吗? 我还没有testing这个代码,它可能不会工作。 我只想让processData在一个线程(一次一个)中运行,并且主要的while循环继续运行,即使队列中有一个线程。 from threading import Thread from win32event import CreateMutex mutex = CreateMutex(None, False, "My Crazy Mutex") while(1) t = Thread(target=self.processData, args=(some_data,)) t.start() mutex.lock() def processData(self, data) while(1) if mutex.test() == False: do some stuff break 编辑:重新读我的代码我可以看到,这是非常错误的。 但是,嘿,这就是为什么我在这里寻求帮助。
对于特定的应用程序,有些实现比其他实现更好吗 有没有什么可以通过推出自己的?
我知道recursion互斥锁允许互斥锁被locking不止一次而没有发生死锁,应该解锁相同的次数。 但是在什么情况下你需要使用recursion互斥? 我正在寻找devise/代码级别的情况。
有什么区别吗? pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 要么 pthread_mutex_t lock; pthread_mutex_init ( &lock, NULL); 如果我只使用第一种方法,我是否足够安全? 注:我的问题主要是指非常小的程序,至多我会做的是连接几个客户端到服务器,并解决他们的查询与工作线程。
当你在并发访问的程序中使用映射时,是否需要在函数中使用互斥来读取值?
当我使用std::unique_lock时,我对std::unique_lock的作用感到困惑。 据我了解的文件 , std::unique_lock基本上是一个臃肿的锁守卫,可以交换两个锁之间的状态。 我到目前为止已经使用了pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)来达到这个目的(我猜这就是STL在posix上使用的)。 它需要一个互斥锁,而不是一个锁。 这里有什么区别? std::condition_variable处理std::unique_lock是一个优化的事实吗? 如果是这样,它究竟如何更快?