在Windows上只运行一个实例?

探讨Windows实例创建与并发问题
本文探讨了在Windows开发中通过内核对象句柄创建实例的方法,指出快速打开多个进程可能导致实例创建冲突的问题,并通过Python代码进行测试,揭示了操作系统层面的并发问题。文章深入分析了实例创建冲突的根本原因及解决思路。

在windows开发中,我们被教导,一个实例的方式可以通过内核对象的句柄来实现,如果系统已经存在了该内核对象句柄,则以后就不应该再次被创建,通常使用的方式是这样的:

m_hMutex = CreateMutex( NULL, TRUE, _T("OneInstance") );
if ( m_hMutex != INVALID_HANDLE_VALUE )
{
// 第二次创建
if ( GetLastError() == ERROR_ALREADY_EXISTS )
{
// do your things

}

}

是的,我们这么做,也没有发现过问题,那还能有什么问题嘛!?

有的,那就是实例可能创建多个!!!!!so,如何才能够创建多个实例呢?

我写了一段python的代码用来进行测试:

#! /usr/bin/env python
#
coding=utf-8

import os
import time
import subprocess

image_folder
='TestImage'

images_ext
= ['.jpg', ".bmp", ".tiff", ".png", ".gif", ".jpeg"]

for file in os.listdir( image_folder ):
name, ext
= os.path.splitext(file)
if ext.lower() notin images_ext:
continue
cmd
='oneinstance.exe %s\\%s'%(image_folder, file)
subprocess.Popen( cmd )

没错,利用管道的形式,打开进程,进程是被我们打开了,然后开始执行代码,由于我们重复执行,这个时候,在执行到CreateMutex的时候,也许另一个进程也在执行CreateMutex,不晓得windows的内核是否存在这方面的问题?

 

是的,系统会存在问题的,因为如果我们快速打开多个进程的时候,一个进程执行到CreateMutex的时候,另一个进程可能也执行到了CreateMutex,甚至在内核处理的时候,都存在CPU切换的问题,这个问题与多线程的问题是同样的道理,只是环境放到了操作系统,而线程变成了进程。

 

于是,我们会看到,存在多个窗口被打开。是否可以考虑,内核中存在同一个名称的Mutex,还是存在多个名称的Mutex?

转载于:https://www.cnblogs.com/ubunoon/archive/2011/11/08/2076638.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值