`

mutex

    博客分类:
  • ruby
 
阅读更多

http://ruby-doc.org/core-1.9.3/Mutex.html

 

Mutex implements a simple semaphore that can be used to coordinate access to shared data from multiple concurrent threads.

Example:

require 'thread'
semaphore = Mutex.new

a = Thread.new {
  semaphore.synchronize {
    # access shared resource
  }
}

b = Thread.new {
  semaphore.synchronize {
    # access shared resource
  }
}
 
 
def synchronize
   self.lock
   begin
      yield
   ensure
      self.unlock rescue nil
   end
end
 

Example without Mutax:

#!/usr/bin/rubyrequire'thread'

count1 = count2 =0
difference =0
counter =Thread.new do
   loop do
      count1 +=1
      count2 +=1
    end
end
spy =Thread.new do
   loop do
      difference +=(count1 - count2).abs
   end
end
sleep 1
puts "count1 :  #{count1}"
puts "count2 :  #{count2}"
puts "difference : #{difference}"

This will produce the following result:

count1 :1583766
count2 :1583766
difference :637992
#!/usr/bin/rubyrequire'thread'
mutex =Mutex.new

count1 = count2 =0
difference =0
counter =Thread.new do
   loop do
      mutex.synchronize do
         count1 +=1
         count2 +=1
      end
    end
end
spy =Thread.newdo
   loop do
       mutex.synchronize do
          difference +=(count1 - count2).abs
       end
    end
end
sleep 1
mutex.lock
puts "count1 :  #{count1}"
puts "count2 :  #{count2}"
puts "difference : #{difference}"

This will produce the following result:

count1 :696591
count2 :696591
difference :0

Handling Deadlock:

When we start using Mutex objects for thread exclusion we must be careful to avoid deadlock. Deadlock is the condition that occurs when all threads are waiting to acquire a resource held by another thread. Because all threads are blocked, they cannot release the locks they hold. And because they cannot release the locks, no other thread can acquire those locks.

This is where condition variables come into picture. A condition variable is simply a semaphore that is associated with a resource and is used within the protection of a particular mutex. When you need a resource that's unavailable, you wait on a condition variable. That action releases the lock on the corresponding mutex. When some other thread signals that the resource is available, the original thread comes off the wait and simultaneously regains the lock on the critical region.

Example:

#!/usr/bin/rubyrequire'thread'
mutex =Mutex.new

cv =ConditionVariable.new
a =Thread.new{
   mutex.synchronize {
      puts "A: I have critical section, but will wait for cv"
      cv.wait(mutex)
      puts "A: I have critical section again! I rule!"}}

puts "(Later, back at the ranch...)"

b =Thread.new{
   mutex.synchronize {
      puts "B: Now I am critical, but am done with cv"
      cv.signal
      puts "B: I am still critical, finishing up"}}
a.join
b.join

This will produce the following result:

A: I have critical section, but will wait for cv
(Later, back at the ranch...)
B:Now I am critical, but am donewith cv
B: I am still critical, finishing up
A: I have critical section again! I rule!
 
 
分享到:
评论

相关推荐

    图文并茂Mutex性能问题解析

    ### 图文并茂Mutex性能问题解析 #### 一、原子操作的重要性 在深入探讨Mutex机制之前,我们需要首先理解原子操作的基本概念。原子操作是Mutex和Latch等锁机制的基础,其重要性在于确保了数据的一致性和完整性,...

    删除程序的 mutex 互斥句柄

    在编程领域,特别是涉及到多线程或多进程编程时,互斥体(Mutex)是一个至关重要的概念。互斥体主要用于同步多个线程或进程对共享资源的访问,确保同一时间只有一个线程或进程能够访问该资源,从而避免数据冲突和竞...

    linux和win32下通用的互斥锁Mutex封装

    在多线程编程中,互斥锁(Mutex)是一种重要的同步机制,用于保证共享资源在同一时刻只能被一个线程访问。本项目提供了在Linux和Windows系统下通用的互斥锁Mutex封装,实现了跨平台的兼容性,使得开发者无需关心底层...

    C# 多线程的同步与互斥(使用Mutex和Event)

    线程首先通过调用mutex.WaitOne()进入临界区,执行一些共享资源的操作,然后调用mutex.ReleaseMutex()释放锁,让其他线程有机会进入。AutoResetEvent则用于控制线程的执行顺序,当一个线程完成任务后,它会设置...

    linux mutex.c 内核源码分析

    - 锁的竞争和等待机制:`mutex_lock_interruptible()`、`mutex_lock_killable()`以及`mutex_lock_nested()`。 - 锁的公平性和死锁预防策略。 通过对`mutex.c`的深入理解,我们可以更好地掌握Linux内核中的同步和...

    C# 使用Mutex实现多线程同步实例

    当一个线程获得了`Mutex`的所有权后,其他尝试获取该`Mutex`的线程将会被阻塞,直到当前持有者释放`Mutex`。这样就保证了在任何时刻只有一个线程能够执行特定的代码段,确保了数据的一致性。 在C#中,`Mutex`类位于...

    linux上互斥线程Mutex的代码及解释

    ### Linux上的互斥线程Mutex详解 在多线程编程中,互斥量(Mutex)是一种常见的同步机制,用于防止多个线程同时访问共享资源,从而避免数据竞争和不一致状态的发生。本文将深入探讨Linux环境下C++互斥线程Mutex的...

    利用Mutex互斥变量实现线程同步机制

    当一个线程获取了Mutex后,其他试图获取该Mutex的线程将被阻塞,直到拥有Mutex的线程释放它。这样可以确保任何时候只有一个线程能访问受保护的代码或资源,从而避免并发问题。 在C++或.NET等支持线程编程的环境中,...

    Laravel开发-laravel-mutex

    在Laravel框架中,"laravel-mutex"是一个用于实现锁机制的库,它帮助开发者在并发环境中确保数据的一致性和完整性。这个库通常用于处理那些需要互斥操作的场景,比如防止多个进程同时执行同一段代码,或者保护共享...

    mutex在线程的使用

    在C++中,`mutex`(互斥量)是实现线程同步的一种基本工具,它允许只让一个线程访问共享资源,从而避免了竞态条件的发生。在VS2008中,我们可以利用C++标准模板库(STL)中的`std::mutex`类来实现这一功能。 首先,...

    mutex锁demo代码.rar

    在Linux系统中,互斥锁(Mutex)是一种用于多线程同步的重要机制,它确保了在任何时刻只有一个线程能够访问特定的临界区。Mutex锁的使用是防止数据竞争和保证线程安全的关键手段。这个"mutex锁demo代码.rar"压缩包...

    使用互斥对象(Mutex)实现线程同步

    - 互斥对象是一种同步对象,它只允许一个线程拥有并访问资源,当一个线程正在使用Mutex控制的资源时,其他试图获取该Mutex的线程会被阻塞,直到Mutex被释放。 - Mutex适用于跨进程的同步,即使在不同进程中的线程...

    Mutex - WinAPI - MetaTrader 5程序库.zip

    Mutex,中文通常称为互斥锁,是Windows API中一种重要的多线程同步机制。在MetaTrader 5(MT5)程序库中,Mutex被用来确保在同一时间只有一个进程或线程可以访问特定的资源,从而避免数据竞争和不一致性的发生。在...

    pthread_mutex_t_is_too_small_for_large_pids_in_aosp_bionic.patch

    32位android中bionic是32位的,其中的mutex只有一半也就是16位能够存储pid,当通过docker运行android时,大概率pid会超过16位的范围,就可能会导致android中mutex死锁,表现为应用卡住黑屏。 [32-bit ABI bugs]...

    利用Mutex标记限制程序重复运行

    Mutex,中文名为互斥锁,是多线程编程中一种重要的同步机制,用于在多个线程之间实现资源的独占访问。在这个特定的例子中,Mutex被用来防止同一个程序的实例在同一时间多次运行,确保程序的单一实例化。下面将详细...

    __lll_mutex_lock_wait的错误原因

    #0 0x00002b9405ea1c38 in __lll_mutex_lock_wait () from /lib64/libc.so.6 #1 0x00002b9405e45e5f in _L_lock_4026 () from /lib64/libc.so.6 #2 0x00002b9405e42df1 in free () from /lib64/libc.so.6 #3 0x00002...

    mutex_writelog.tar.gz

    在给定的“mutex_writelog.tar.gz”压缩包中,包含了一个利用C语言编写的、带有互斥锁(mutex)的日志写入实现。这个实现确保了在多线程环境下日志记录的正确性和一致性。 首先,让我们深入理解“互斥锁”(Mutex)...

    windows多用户多session下使用Mutex进行同步控制源代码

    Mutex是全局命名空间的,这意味着它在整个系统范围内都是唯一的,无论哪个用户、哪个会话创建了这个Mutex,其他所有会话都能识别并访问它。在MFC(Microsoft Foundation Classes)库中,我们可以使用CMutex类来封装...

    线程同步-mutex方案-Peterson方案

    本文将详细探讨线程同步中的两种经典解决方案:mutex方案和Peterson方案,以及它们在Java环境中的实现。 首先,我们来了解mutex(互斥锁)方案。Mutex是一种基本的同步原语,它的主要目标是防止多个线程同时进入...

    linux 内核mutex.c 源码分析实例

    linux 内核 mutex.c 源码分析实例,我的实例主要先初始化了一个互斥体m,然后获取互斥体的锁(解锁),紧接着释放互斥体的锁(解锁)。最后释放互斥体。中间通过输出m.count来显示互斥体的状态。

Global site tag (gtag.js) - Google Analytics