精华内容
下载资源
问答
  • Mutex

    2020-04-02 10:42:00
    用途:用于控制一个应用程序只有一个实例运行。...privatestatic Mutex _mutex; static void Main(){ if( ! IsStarted()){ Current.ShutDown(); return; } .... } private bool IsStarted(){ _mutex = new M...

    用途:用于控制一个应用程序只有一个实例运行。

    举例: 

    class Client{

    private static Mutex _mutex;

    static void Main(){

     if( ! IsStarted()){

     Current.ShutDown();

     return; 

    }

    .... 

    }

     

    private bool IsStarted(){

    _mutex = new Mutex(true,"APPName",isCreatedNew);

    return isCreatedNew; 

    }

    }

     

    Mutex():用无参数的构造函数得到的Mutex没有任何名称,而进程间无法通过变量的形式共享数据,所以没有名称的Mutex也叫做局部(Local)Mutex。另外,这样创建出的Mutex,创建者对这个实例并没有拥有权,仍然需要调用WaitOne()去请求所有权。


    Mutex(Boolean initiallyOwned):与上面的构造函数一样,它只能创建没有名称的局部Mutex,无法用于进程间的同步。Boolean参数用于指定在创建者创建Mutex后,是否立刻获得拥有权,因此Mutex(false)等效于Mutex()。


    Mutex(Boolean initiallyOwned, String name):在这个构造函数里我们除了能指定是否在创建后获得初始拥有权外,还可以为这个Mutex取一个名字。只有这种命名的Mutex才可以被其它应用程序域中的程序所使用,因此这种Mutex也叫做全局(Global)Mutex。如果String为null或者空字符串,那么这等同于创建一个未命名的Mutex。因为可能有其他程序先于你创建了同名的Mutex,因此返回的Mutex实例可能只是指向了同名的Mutex而已。但是,这个构造函数并没有任何机制告诉我们这个情况。因此,如果要创建一个命名的Mutex,并且期望知道这个Mutex是否由你创建,最好使用下面两个构造函数中的任意一个。最后,请注意name是大小写敏感的。


    Mutex(Boolean initiallyOwned, String name, out Boolean createdNew):头两个参数与上面的构造函数相同,第三个out参数用于表明是否获得了初始的拥有权。这个构造函数应该是我们在实际中使用较多的。


    Mutex(Boolean initiallyOwned, String name, out Booldan createdNew, MutexSecurity):多出来的这个MutexSecurity参数,也是由于全局Mutex的特性所决定的。因为可以在操作系统范围内被访问,因此它引发了关于访问权的安全问题,比如哪个Windows账户运行的程序可以访问这个Mutex,是否可以修改这个Mutext等等。


    展开全文
  • mutex

    2013-08-20 13:50:00
    #define pthread_mutexattr_t attr;...pthread_mutex_tXX_mutex; #functions: pthread_mutexattr_init pthread_mutexattr_settype pthread_mutex_init pthread_mutex_lock pthread_mutex_unlock...

    #define

    pthread_mutexattr_t attr;

    pthread_mutex_t     XX_mutex;

     

    #functions:

    pthread_mutexattr_init

    pthread_mutexattr_settype

    pthread_mutex_init

     

    pthread_mutex_lock

     

    pthread_mutex_unlock

    转载于:https://www.cnblogs.com/kuangniuniu/p/3270055.html

    展开全文
  • MutexLock

    2020-10-29 08:34:43
    class CAPABILITY("mutex") MutexLock : noncopyable { public: MutexLock() : holder_(0) { MCHECK(pthread_mutex_init(&mutex_, NULL)); } ~MutexLock() { assert(holder_ == 0); MCHECK(pthread_...
    class CAPABILITY("mutex") MutexLock : noncopyable
    {
     public:
      MutexLock()
        : holder_(0)
      {
        MCHECK(pthread_mutex_init(&mutex_, NULL));
      }
    
      ~MutexLock()
      {
        assert(holder_ == 0);
        MCHECK(pthread_mutex_destroy(&mutex_));
      }
    
      // must be called when locked, i.e. for assertion
      bool isLockedByThisThread() const
      {
        return holder_ == CurrentThread::tid();
      }
    
      void assertLocked() const ASSERT_CAPABILITY(this)
      {
        assert(isLockedByThisThread());
      }
    
      // internal usage
    
      void lock() ACQUIRE()
      {
        MCHECK(pthread_mutex_lock(&mutex_));
        assignHolder();
      }
    
      void unlock() RELEASE()
      {
        unassignHolder();
        MCHECK(pthread_mutex_unlock(&mutex_));
      }
    
      pthread_mutex_t* getPthreadMutex() /* non-const */
      {
        return &mutex_;
      }
    
     private:
      friend class Condition;
    
      class UnassignGuard : noncopyable
      {
       public:
        explicit UnassignGuard(MutexLock& owner)
          : owner_(owner)
        {
          owner_.unassignHolder();
        }
    
        ~UnassignGuard()
        {
          owner_.assignHolder();
        }
    
       private:
        MutexLock& owner_;
      };
    
      void unassignHolder()
      {
        holder_ = 0;
      }
    
      void assignHolder()
      {
        holder_ = CurrentThread::tid();
      }
    
      pthread_mutex_t mutex_;
      pid_t holder_;
    };
    
    // Use as a stack variable, eg.
    // int Foo::size() const
    // {
    //   MutexLockGuard lock(mutex_);
    //   return data_.size();
    // }
    class SCOPED_CAPABILITY MutexLockGuard : noncopyable
    {
     public:
      explicit MutexLockGuard(MutexLock& mutex) ACQUIRE(mutex)
        : mutex_(mutex)
      {
        mutex_.lock();
      }
    
      ~MutexLockGuard() RELEASE()
      {
        mutex_.unlock();
      }
    
     private:
    
      MutexLock& mutex_;
    };

    Mutex.h头文件实现了一个采用RAII管理的锁。

    其中MutexLock类就是实现了一个锁的基本操作,包含两个成员,mutex_就是内部锁,holder_记录拥有锁的线程,采用构造函数初始化锁,析构函数销毁锁,并提供了判断锁是否为本线程所持有的isLockedByThisThread接口,以及lock和unlock操作。getPthreadMutex是条件变量使用的接口,因为条件变量需要锁的指针。该类中最不容易理解的是私有类UnassignGuard的作用。先说MutexLockGuard,最后再说UnassignGuard。MutexLockGuard很简单,就是通过构造和析构来调用加解锁,将RAII原则贯彻到底,避免忘记释放锁。

    最后说UnassignGuard,只有一个成员,即MutexLock的引用。该类只有构造函数和析构函数,其中构造函数将holder_赋值为0,析构函数将holder_赋值为当前线程,其实这个内部类,也是提供条件变量使用的,之后还会单独写一个关于条件变量的,但是这里先说一下。

    在ThreadPool.cc中有这么一段代码,

        MutexLockGuard lock(mutex_);
        while (isFull() && running_)
        {
          notFull_.wait();
        }

    这时候MutexLockGuard会调用MutexLock的lock接口,lock接口会调用assignHolder将holder_赋值为当前线程,而notFull条件变量在调用wait接口代码如下:

      void wait()
      {
        MutexLock::UnassignGuard ug(mutex_);
        MCHECK(pthread_cond_wait(&pcond_, mutex_.getPthreadMutex()));
      }

    可以看到wait里会先调用UnassignGuard的构造函数,之后pthread_cond_wait会释放mutex_,由于MutexLockGuard没有析构,所以无法通过MutexLockGuard析构函数调用unlock释放锁,在调用unlock时会将holder_赋值为0,所以UnassignGuard的构造函数相当于替代MutexLockGuard析构函数。再说UnassignGuard的析构函数,在pthread_cond_wait后释放了mutex_后,被其他线程获取该锁,之后释放,最终notFull条件变量被唤醒的时候,会自动加锁,可是这时候锁的holder_已经被其他线程修改了,所以这时候阻塞在notFull的线程获取的锁需要修改holder_为自己的线程ID,否则调用isLockedByThisThread就会失败,这个修改holder_的功能就是通过UnassignGuard的析构实现的。

    上面大体上就是我现在的理解,可能有不对的地方,之后再修改吧。。。。

    展开全文
  • C# Mutex

    2019-07-21 00:06:05
    Mutex Mutex 类似于C# lock, 区别在于一个Mutex可以在多个进程间使用.也就是说Mutex既是computer-wide又是application-wide. 注意: 获取和释放Mutex大概比lock要多五十倍时间. 调用WaitOne()来获得锁, Release...

    Mutex

    Mutex 类似于C# lock, 区别在于一个Mutex可以在多个进程间使用.也就是说Mutex既是computer-wide又是application-wide.

    注意: 获取和释放Mutex大概比lock要多五十倍时间.

    调用WaitOne()来获得锁, ReleaseMutex()来解除锁.关闭或者杀死Mutex会自动释放掉锁.和lock一样, Mutex只能从拥有它的线程释放掉.

    cross-process Mutex的常见用处是用来确保某个程序只有一个实例在运行.

    代码如下:

     

    class OneAtATimePlease
    {
    static void Main()
    {
    // Naming a Mutex makes it available computer-wide. Use a name that's
    // unique to your company and application (e.g., include your URL).
    using (var mutex = new Mutex (false, "oreilly.com OneAtATimeDemo"))
    {
    // Wait a few seconds if contended, in case another instance
    // of the program is still in the process of shutting down.
    if (!mutex.WaitOne (TimeSpan.FromSeconds (3), false))
    {
    Console.WriteLine ("Another instance of the app is running. Bye!");
    return;
    }
    RunProgram();
    }
    }
    static void RunProgram()
    {
    Console.WriteLine ("Running. Press Enter to exit");
    Console.ReadLine();
    }
    }


    在Terminal Services下运行时, computer-wide Mutex 只有在同一个terminal server session 中的程序可见, 如果要让它在所有 Terminal Serverces sessions 可见, 则需要在它名字前面加上\.

     


     

    转载于:https://www.cnblogs.com/riasky/p/3481795.html

    展开全文
  • C语言 mutex

    2019-04-24 20:55:22
    int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); 参1:传出参数,调用时应传 &mutex restrict关键字:所有修改该指针指向内存中内容的操作,只能通过本...
  • mutex简介

    2017-04-26 10:52:19
    linux mutex
  • hierarchical mutex

    2017-03-19 11:03:53
    hierarchical mutex
  • mutex
  • 1. mutex_init\mutex_lock\mutex_unlock  #define mutex_init(mutex) \ do { \ static struct lock_class_key __key; \  \ __mutex_init((mutex), #mutex, &__key);\ } while (0) void __sched mutex_...
  • mutex 独占互斥量,只能加锁一次,不够人性化,我就是想加锁多次 std::mutex globalMutex; recursive_mutex 递归的独占互斥量,允许同一个线程,同一个互斥量,多次被lock,用法和非递归的一样 跟windows的临界区是...
  • mutex 使用介绍

    2021-05-24 15:56:48
    文章目录一、mutex 基本函数1. `int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);`2. `int pthread_mutex_lock(pthread_mutex_t *mutex);`3. `int pthread_mutex_trylock...
  • C#中Mutex的用法

    万次阅读 2016-11-23 13:33:17
    Mutex
  • 原文链接:并发之(互斥体mutex、lock_guard、recursive_mutex、timed_mutex、recursive_timed_mutex、unique_lock) 一、mutex mutex全名mutual exclusion(互斥体),是个object,用来协助采取独占排他方式控制...
  • linux Mutex

    2017-06-07 10:16:44
    一、互斥锁 ...对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init.  对于动态分配的互斥量, 在申请内存(malloc)之后, 通过pthread_mutex_init进行初始
  • sync.mutex

    2019-04-23 16:48:24
    mutex sync.mutex mutex.Lock() defer mutex.Unlock()
  • C++:mutex

    千次阅读 多人点赞 2019-07-04 18:04:10
    一、C++的mutex库 互斥量 C++11中提供了std::mutex互斥量,共包含四种类型: std::mutex:最基本的mutex类。 std::recursive_mutex:递归mutex类,能多次锁定而不死锁。 std::time_mutex:定时mutex类,可以锁定一定...
  • mutex_init() / mutex_lock() / mutex_unlock()

    千次阅读 2018-09-05 13:21:03
    请求 1). 初始化互斥体 -- mutex_init(); 2). 获得互斥体 -- mutex_lock(); 3). 释放互斥体 -- mutex_unlock();...1.mutex_init(), 注意...__mutex_init(struct mutex *lock, const char *name, struct lock_class...
  • std mutex

    2017-11-06 14:07:26
    mutex mm2; int cale = 0; void shared_mutex_Test(string url) { while (true) { mm2.lock(); printf(“%s–>%d\n”, url.c_str(),cale); cale++; mm2.unlock();
  • 背景:同时开启两个线程调用同一函数,使用Mutex来保证一个线程独占一个资源的访问。因为某些需求,临时abort了thread1 ,这时程序报错,—出现被放弃的mutex static Mutex mutex; static Thread thread1, thread2;...
  • 创建一把锁:pthread_mutex_t mutex; 使用互斥锁缺点? 串行 互斥锁的使用步骤 1、创建互斥锁: pthread_mutex_t mutex; 2、初始化: pthread_mutex_init(&mutex, NULL); 3、找到线程共同操作的共享数据 4、加锁: ...
  • 对于mutex 使用锁有三种情况, 1、任何线程都没有使用mutex, 则调用的线程使用mutex 2、有其他线程使用mutex,当前调用的线程会阻塞,直到其他使用锁的线程锁释放 3、如果mutex被同一线程调用,会产生死锁; ...
  • int pthread_mutex_init (pthread_mutex_t *__mutex,const pthread_mutexattr_t *__mutexattr)创建一个锁; int pthread_mutex_destroy (pthread_mutex_t *__mutex)销毁锁; int pthread_mutex_trylock (pthread_mute....
  • 图文并茂Mutex性能问题解析,理解Mutex的机制,对于理解共享池的争用,意义巨大

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,282
精华内容 10,512
关键字:

mutex