在同一个进程里,可以多次waitfor到同一锁。

解决方案 »

  1.   

    GetLastError看看创建时是否成功了?再确保在wait的时候mutex已经创建了。
      

  2.   

    Mutex主要用于线程间的互斥访问,可以是不同进程的线程。
    但你这些按钮都是MFC的UI主线程吧,拥有Mutex的线程是可以多次Wait成功的。
    CreateThread几个线程,用多线程测一下。
      

  3.   

    这样啊,那这个WaitForSingleObject还有何意义呢。
    我的程序在OnTimer函数中和某些消息中要访问一个链表,在消息中可能会删除链表中的节点,而在OnTimer函数中可能又要读到该链中的节点,所以必需要对该链进行保护。要不然,有可能OnTimer中正在读取的节点正好在消息函数中已经删除的。程序奔溃。
    大神们,给个方案啊。
      

  4.   

    这样啊,那这个WaitForSingleObject还有何意义呢。
    我的程序在OnTimer函数中和某些消息中要访问一个链表,在消息中可能会删除链表中的节点,而在OnTimer函数中可能又要读到该链中的节点,所以必需要对该链进行保护。要不然,有可能OnTimer中正在读取的节点正好在消息函数中已经删除的。程序奔溃。
    大神们,给个方案啊。
    意义在于在释放线程资源和关闭线程的时候更安全
      

  5.   

    现在我的程序是由一个主线程来完成的,只是里面有同时来自OnTimer 和系统消息函数对同一资源的操作,这种情况该如何进行保护啊。求大神...
      

  6.   

    同一个线程中肯定是顺序执行的,这点毋庸置疑。同一个线程中肯定是顺序执行的,这点毋庸置疑。大神,给点指点吧:
    我就在一个基于对话框程序中做的,在该对话框程序中,有一个Timer,是2秒中执行一次,然后该对话框程序中还接收通讯端发来的消息。在OnTimer函数和通讯消息函数中都操作了同一个数据链表,它都可能在进行读取链表或删除链表。问题来了,如果OnTimer在删除,而消息函数正在读取被删除的节点,程序就崩溃了,所以我必需要有一个能保护链表的操作啊,用了互斥对像还有关键代码段,都不行,这种情况该怎么办才好呢。
      

  7.   

    同一个线程中肯定是顺序执行的,这点毋庸置疑。同一个线程中肯定是顺序执行的,这点毋庸置疑。大神,给点指点吧:
    我就在一个基于对话框程序中做的,在该对话框程序中,有一个Timer,是2秒中执行一次,然后该对话框程序中还接收通讯端发来的消息。在OnTimer函数和通讯消息函数中都操作了同一个数据链表,它都可能在进行读取链表或删除链表。问题来了,如果OnTimer在删除,而消息函数正在读取被删除的节点,程序就崩溃了,所以我必需要有一个能保护链表的操作啊,用了互斥对像还有关键代码段,都不行,这种情况该怎么办才好呢。
    最简单的方案是所有的操作都通过消息的方式发给主线程
    让主线程去排队和管理
      

  8.   

    互斥量和临界区都拥有这个特性,就是通一个线程多次进入不会阻塞。你也可以用其他的比如事件。
    另外这里你的OnTimer只会在主线程执行,你说的消息如果是MFC消息,也自然也是在主线程执行,根本不需要同步,如果是类似回调的在其他线程中执行,互斥量也足够了。同一个线程多次拥有互斥量,只要对应的release掉也不会有问题。
    当然比较好的选择就是10楼的发送消息,不需要你再同步