精华内容
下载资源
问答
  • 互斥

    2009-04-12 11:39:00
    如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。 参数 lpMutexAttributes 指向一个SECURITY_ATTRIBUTES结构的指针,这个结构决定互斥体句柄是否被子进程继承。 ...
      
    

      在工程文件中, WinMain函数里加上以下代码(此代码在BCB6.0下运行):
             HANDLE hMutex = CreateMutex(NULL, false, "Process");
             if (GetLastError() == ERROR_ALREADY_EXISTS)
             {
                CloseHandle(hMutex);
                MessageBox(Application->Handle, "程序已经在运行中,不能重复启动!", "提示", MB_OK +MB_ICONWARNING);
                Application->Terminate();
                return 0;
             }
             Application->CreateForm(__classid(TForm1), &Form1);

            主要使用到CreateMutex()函数和GetLastError()以及一个常量ERROR_ALREADY_EXISTS.

            当然, 你的程序有窗体的话, 还可以使用FindWindow().
            void *handle = FindWindow(NULL, WindowName.c_str());
            if (handle!=NULL)
                return 0;


    以下有一个摘录: http://topic.csdn.net/t/20051121/15/4407868.html

    进程的互斥运行

      正常情况下,一个进程的运行一般是不会影响到其他正在运行的进程的。但是对 于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设备的程序运行的,而且此类程序通常也不允许 运行同一个程序的多个实例。这就引出了进程互斥的问题。

      实现进程互斥的核心思想比较简单:进程在启动时首先检查当前系统是否已经存在 有此进程的实例,如果没有,进程将成功创建并设置标识实例已经存在的标记。此后再创建进程时将会通过该标记而知晓其实例已经存在,从而保证进程在系统中只 能存在一个实例。具体可以采取内存映射文件、有名事件量、有名互斥量以及全局共享变量等多种方法来实现。下面就分别对其中具有代表性的有名互斥量和全局共 享变量这两种方法进行介绍:

    // 创建互斥量
    HANDLE m_hMutex = CreateMutex(NULL, FALSE, "Sample07");
    // 检查错误代码
    if (GetLastError() == ERROR_ALREADY_EXISTS) {
     // 如果已有互斥量存在则释放句柄并复位互斥量
     CloseHandle(m_hMutex);
     m_hMutex = NULL;
     // 程序退出
     return FALSE;
    }

      上面这段代码演示了有名互斥量在进程互斥中的用法。代码的核心是CreateMutex()对有名互斥量的创建。CreateMutex()函数可用来创建一个有名或无名的互斥量对象,其函数原型为:

     

    HANDLE CreateMutex(
     LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针
     BOOL bInitialOwner, // 初始化互斥对象的所有者
     LPCTSTR lpName // 指向互斥对象名的指针
    );

      如果函数成功执行,将返回一个互斥量对象的句柄。如果在CreateMutex()执行前已经存在有相同名字的互斥量,函数将返回这个已经存在 互斥量的句柄,并且可以通过GetLastError()得到错误代码ERROR_ALREADY_EXIST。可见,通过对错误代码 ERROR_ALREADY_EXIST的检测可以实现CreateMutex()对进程的互斥。

            建立互斥体,用来同步。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。

    参数
    lpMutexAttributes
    指向一个SECURITY_ATTRIBUTES结构的指针,这个结构决定互斥体句柄是否被子进程继承。     
    bInitialOwner
    布尔类型,决定互斥体的创建者是否为拥有者
    lpName
    指向互斥体名字字符串的指针。互斥体可以有名字。
    互斥体的好处是可以在进程间共享

    心得体会:
        CreateMutex() 用于有独占要求的程序 (在其进程运行期间不允许其他使用此端口设备的程序运行,或不允许同名程序运行)。如有同名程序运行,则通过 GetLastError()得到错误代码 ERROR_ALREADY_EXIST

    刚才又执行了下得出的结果(程序名samp)
           一般情况下:一进入调试阶段,进程管理器中就出现了samp进程,执行到CreateMutex时返回进程句柄,执行到if(GetLastError() == ERROR_ALREADY_EXISTS ) 进行判断时,跳过不执行if中的内容,所以表示没有互斥。
           调试之前先运行debug中的samp.exe再调试:一进入调试阶段,进程管理器中就出现了两个samp进程,执行到CreateMutex时返回进程 句柄,执行到if(GetLastError() == ERROR_ALREADY_EXISTS ) 进行判断时,执行if中的内容,表示有互斥。

    展开全文
  • 时间段互斥算法SQL实现

    万次阅读 2021-03-05 11:02:15
    本文不针对全部需求进行设计,只讨论时间互斥的实现 实现思路 当前需要写入时间段S1----E1,场景模型建立: 表中的开始字段记为S,结束时间记为E,以下用区间标记列举存在场景: case1: S<=S1<=E<=E1 case2...
    背景

    最近有接到需求,线上需要创建一个活动信息,同一时间段只能生效一个活动,活动状态需要自动流转。本文不针对全部需求进行设计,只讨论时间互斥的实现

    实现思路

    当前需要写入时间段S1----E1,场景模型建立:
    表中的开始字段记为S,结束时间记为E,以下用区间标记列举存在场景:
    case1: S<=S1<=E<=E1
    case2: S1<=S<=E1<=E
    case3: S<=S1<=E1<=E
    case4: E1<S || E<S1
    以上四种情况中,前三种都可以实现时间互斥,但是如果我们的判断条件去实现,会需要跑三次SQL才能实现,是否可以做一下精简,case4中为时间不互斥的场景,这个场景很明确,直接取反是否可行,case4取反得到的表达式即为:
    case5: E1>=S && E<=S1
    针对case5的场景,可以通过区间画图验证,是case1/2/3的交集,也即为我们需要的互斥判断条件,如果此区间查询到的数据是存在的,即我们当前设置的起始时间与表中已存在的时间段是互斥的。
    select * from user where end_time <= ${startTime} and start_time <= ${endTime}

    结果

    问题分析后即可实现以一条SQL实现时间段互斥的判断,如果各位有更好的实现方案,欢迎留言讨论。

    展开全文
  • using (var mutex = new Mutex(false, "name")) { try { mutex.WaitOne(); //do something } catch(Exception ex) { throw ex; } finally { mutex.ReleaseMutex(); } }
  • 进程互斥课件进程互斥课件进程互斥课件进程互斥课件
  • 单选按钮互斥

    2017-09-12 18:43:42
    代码类资源请使用单选按钮互斥,二选一,代码类资源请使用单选按钮互斥,二选一代码类资源请使用单选按钮互斥,二选一代码类资源请使用单选按钮互斥,二选一代码类资源请使用单选按钮互斥,二选一代码类资源请使用...
  • 互斥

    2019-10-23 10:59:17
    1、互斥锁基本原理: 互斥锁是一个二元变量,其状态为开锁(允许0)和上锁(禁止1),将某个共享资源与某个特定互斥锁在逻辑上绑定(要申请该资源必须先获取锁)。 (1)访问公共资源前,必须申请该互斥锁,若处于开锁状态...

    互斥锁

    线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。互斥锁为资源引入一个状态:锁定/非锁定。某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性

    1、互斥锁基本原理:
    互斥锁是一个二元变量,其状态为开锁(允许0)和上锁(禁止1),将某个共享资源与某个特定互斥锁在逻辑上绑定(要申请该资源必须先获取锁)。
    (1)访问公共资源前,必须申请该互斥锁,若处于开锁状态,则申请到锁对象,并立即占有该锁,以防止其他线程访问该资源;如果该互斥锁处于锁定状态,则阻塞当前线程。
    (2)只有锁定该互斥锁的进程才能释放该互斥锁,其他线程试图释放无效。

    2、初始化互斥锁:
    使用之前,需要定义互斥锁,使用函数:pthread_mutex_t lock;进行定义

    extern int    pthread_mutex_init(pthread_mutex_t * **_mutex**,_const pthread_mutex_mutexattr_t*  **_mutexattr**)
    

    参数: _mutex 初始化的互斥锁的指针
    _mutexattr 指向对象的指针,若为空则默认属性

    3、申请互斥锁
    如果一个线程要占用共享资源,必须先申请对应互斥锁,使用函数:
    以阻塞方式申请互斥锁:

    extern int pthread_mutex_lock(pthread_mutex* _mutex)
    

    以非阻塞方式申请互斥锁:

    extern int pthread_mutex_trylock(pthread_mutex* _mutex
    

    4、释放互斥锁
    释放互斥锁函数:

    extern int pthread_mutex_unlock(pthread_mutex_t* _mutex)
    

    死锁

    死锁是指一个资源被多次调用,而多次调用方都未能释放该资源就会造成一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁

    死锁产生:
    一个线程内部多次加锁缺没有释放引起死锁
    多个线程内部多次调用引起死锁
    python中的实例

    展开全文
  • mobiscroll多选互斥

    2017-10-23 10:41:18
    mobiscroll多选互斥。实现select的多选分组互斥操作。例如,选择“无”之后,反选所有用户之前选中的值,让用户减少无用的点击
  • 操作系统进程互斥及同步互斥PPT课件PPT学习教案.pptx
  • 互斥锁演示

    2018-03-30 14:33:07
    演示了互斥锁的原因,演示了互斥锁的原因,演示了互斥锁的原因
  • 互斥量和互斥锁的关系

    千次阅读 2019-04-10 13:12:04
    刚开始学习时遇到互斥锁和互斥量这两个名词时,就是不知道他们有什么关系,百度很久也很少有相关资料(我已经在百度百科也添加了了这么一句话:互斥量又称互斥锁),后来在周立功《嵌入式Linux开发教程》上册,找到...

    刚开始学习时遇到互斥锁和互斥量这两个名词时,就是不知道他们有什么关系,百度很久也很少有相关资料(我已经在百度百科也添加了了这么一句话:互斥量又称互斥锁),后来在周立功《嵌入式Linux开发教程》上册,找到他们两者的关系顺便记录下来供大家学习和查找方便。以下为摘抄部分(如果有侵权请联系及时删除):

    互斥量(Mutex), 又称为互斥锁, 是一种用来保护临界区的特殊变量, 它可以处于锁
    定(locked) 状态, 也可以处于解锁(unlocked) 状态:

     1、如果互斥锁是锁定的, 就是某个特定的线程正持有这个互斥锁

    2、如果没有线程持有这个互斥锁,那么这个互斥锁就处于解锁状态


    每个互斥锁内部有一个线程等待队列,用来保存等待该互斥锁的线程。当互斥锁处于解
    锁状态时, 如果某个线程试图获取这个互斥锁, 那么这个线程就可以得到这个互斥锁而不会
    阻塞;当互斥锁处于锁定状态时, 如果某个线程试图获取这个互斥锁, 那么这个线程将阻塞
    在互斥锁的等待队列内。
    互斥量是最简单也是最有效的线程同步机制。程序可以用它来保护临界区,以获得对排
    它性资源的访问权。另外,互斥量只能被短时间地持有,使用完临界资源后应立即释放锁。

    每个互斥锁内部有一个线程等待队列,用来保存等待该互斥锁的线程。当互斥锁处于解
    锁状态时, 如果某个线程试图获取这个互斥锁, 那么这个线程就可以得到这个互斥锁而不会
    阻塞;当互斥锁处于锁定状态时, 如果某个线程试图获取这个互斥锁, 那么这个线程将阻塞
    在互斥锁的等待队列内。
    互斥量是最简单也是最有效的线程同步机制。程序可以用它来保护临界区,以获得对排
    它性资源的访问权。另外,互斥量只能被短时间地持有,使用完临界资源后应立即释放锁。

    摘抄自周立功的《嵌入式Linux开发教程》上册,如果有侵权请联系及时删除

    另外要注意的是,还有个和互斥量很像的名词,叫信号量,这个就和互斥量是两个东西了,注意区分。

    展开全文
  • 进程互斥实验

    2015-10-07 21:27:11
    进程互斥实验
  • 互斥锁例程

    2015-09-22 14:40:31
    互斥锁例程
  • 进程互斥

    万次阅读 2012-07-11 18:13:14
    进程间共享数据的保护,需要进程互斥锁。与线程锁不同,进程锁并没有直接的C库支持,但是在Linux平台,要实现进程之间互斥锁,方法有很多,大家不妨回忆一下你所了解的。下面就是标准C库提供的一系列方案。 1、实现...
  • 读写互斥封装

    2018-05-10 22:45:47
    这是一个很不错的读写互斥的封装类例子,方便大家加入到自己的工程中学习借鉴。
  • 线程 互斥.rar案例

    2021-01-26 17:28:26
    线程 互斥.rar
  • 互斥量(互斥锁)

    万次阅读 2018-10-26 15:32:27
    一、互斥量mutex Linux提供一把互斥锁mutex(也称之为互斥量) 每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束后解锁。 资源还是共享的,线程间也还是竞争的,但通过锁将资源的访问变为互斥操作...
  • aosProj2 使用Roucairol和Carvalho的分布式互斥算法实现互斥服务
  • Java互斥锁简单实例

    2020-09-03 13:27:19
    主要介绍了Java互斥锁,较为详细的分析了java互斥锁的概念与功能,并实例描述了java互斥锁的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • FreeRTOS互斥

    千次阅读 2019-03-09 23:06:35
    信号量API函数实际上都是宏,它使用现有的队列机制。这些宏定义在semphr.h文件中。如果使用信号量或者互斥...互斥锁和递归互斥锁:互斥锁是用来保证共享数据操作的完整性,同时只能有一个任务访问共享数据。递归互斥...
  • 互斥体特征Mutex的低级API定义该项目由资源团队开发和维护。 文档最低支持的Rust V互斥特性-Mutex的低级API定义该项目由资源团队开发和维护。 文档最低支持的Rust版本(MSRV)确保此板条箱可在稳定的Rust 1.31.0及更...
  • 一、同步与互斥的概念   现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行。在多任务操作系统中,同时运行的多个任务可能: 都需要访问/使用同一种资源; 多个任务之间有依赖关系,某个...
  • 主要介绍了Powershell互斥参数使用实例,本文给出了两个代码示例来讲解互斥参数的使用,需要的朋友可以参考下
  • 互斥服务器 1.概述 npm install --save mutex-server 网络级别的关键部分。 mutex-server是一个npm模块,可用于构建互斥锁服务器。 当您需要在整个系统级别上控制关键部分时,例如使用网络通信的分布式处理系统,...
  • 互斥量简单示例互斥量简单示例互斥量简单示例互斥量简单示例互斥量简单示例互斥量简单示例互斥量简单示例互斥量简单示例
  • 线程进程互斥

    2017-03-01 19:58:16
    线程进程互斥
  • 前面《秒杀多线程第四篇一个经典的多线程同步问题》提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了四篇《秒杀多...
  • 使用-互斥-源码

    2021-02-13 17:30:20
    使用-互斥
  • 操作系统的实验课设,实现Dekker,Lamport,Peterson,Eisenberg进程互斥访问临界区算法,使用java语言完成,可以动态显示进程访问临界区时各个进程的状态
  • 互斥方法

    2019-04-23 10:56:59
    多CPU并行执行时,只屏蔽一个CPU是无用的,无法解决互斥问题 2.软件方法 必须交替运行 临界区三大属性:progress、互斥,不会无限等待 无互斥性 反证法 dex算法: N进程解决方法1: N进程...
  • signalr实现登录互斥

    2018-08-13 10:11:58
    使用signalr 1.1.4 版本实现用户登录互斥功能,配合framework4.0

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 298,823
精华内容 119,529
关键字:

互斥