WIN32 多线程程序设计一书中有如下部分。

问题描述

WIN32 多线程程序设计一书中有如下部分。

问下这样的程序为什么会产生死锁?
当线程A 执行InitializeCriticalSection(list1->critical_sec);之后线程B怎么还可能执行
InitializeCriticalSection(list2->critical_sec); 这段不是早就被A给锁住了吗?

void SwapLists(List *list, List *list2)
{
List *tmp_list;
EnterCriticalSection(list1->critical_sec);
EnterCriticalSection(list2->critical_sec);
tmp->list = list1->head;
list1->head = list2->head;
list2->head = temp->list;
LeaveCriticalSection(list1->critical_sec);
LeaveCriticalSection(list2->critical_sec);
}

解决方案

因为两个线程的list1和list2参数可以不同,假设A调用的参数(这里指实参,不是形参)是list1 list2,B调用的是list2 list1
那么可能两个list都锁上,并且等待另一个。
你的疑惑在于,你觉得多个线程都是调用的一样的参数。

解决方案二:

InitializeCriticalSection 最好在用临界区的线程之外做
不然没有初始化的临界区,EnterCriticalSection 是会出错的
一个简单的方式是,用类封装临界区,
用 构造函数 InitializeCriticalSection,析构函数DeleteCriticalSection
这样EnterCriticalSection,LeaveCriticalSection 这种加锁,解锁的函数才不会出问题。
MFC有CCriticalSection 类 可用

时间: 2024-09-27 00:08:15

WIN32 多线程程序设计一书中有如下部分。的相关文章

深入浅出Win32多线程程序设计之基本概念

一.深入浅出Win32多线程程序设计之基本概念[转] 引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档. 理解多线程及其同步.互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控制也非常容易.许多程序员从来没有学习过嵌入式系统领域著名的操作系统Vx

《win32多线程程序设计》随笔1

近日,因为即将离开目前的工作单位,处于工作交接的阶段,工作不太忙. 又因朋友给介绍了一家公司,做多线程方面的研发,问及我对多线程了解的程度,我坦诚的说了解的不多. 这就使我有了机会去接触这本书--<win32多线程程序设计>.当时只是打算随便找本书补一下自己在这个方面知识的缺陷,当看到这本书的译者是侯捷老师的时候,我就知道这本书一定是本好书. 这些天用了些零碎的时间把这本书的前4章看了下,有一些小体会,记录下来,留给自己总结提高,如果能对别人有帮助,那是再好不过了. 近几个月一直在埋头写程序和

c语言-《Windows程序设计》书中有句——“字符串「Hello!」中的6个字符占用16位 ”怎么理解?

问题描述 <Windows程序设计>书中有句--"字符串「Hello!」中的6个字符占用16位 "怎么理解? <Windows程序设计>一书中有句话: "字符串「Hello!」中的6个字符占用16位:" 0x0048 0x0065 0x006C 0x006C 0x006F 0x0021 为什么是16位呢? 哪位大牛能够解释? 解决方案 一共8个拉丁字母或半角符号,每个占两位 解决方案二: 16位,16位是两个字节,最多放两个字符,你没看错吧

深入浅出Win32多线程程序设计-【1】基本概念

  引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档. 理解多线程及其同步.互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控制也非常容易.许多程序员从来没有学习过嵌入式系统领域著名的操作系统VxWorks,但是立马就能在上面做开发,大概要归功于

深入浅出Win32多线程程序设计-【3】线程通信

  简介 线程之间通信的两个基本问题是互斥和同步. 线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒. 线程互斥是指对于共享的操作系统资源(指的是广义的"资源",而不是Windows的.res文件,譬如全局变量就是一种共享资源),在各线程访问时的排它性.当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源. 线程互斥是一种

深入浅出Win32多线程程序设计-【2】线程控制

  WIN32线程控制主要实现线程的创建.终止.挂起和恢复等操作,这些操作都依赖于WIN32提供的一组API和具体编译器的C运行时库函数. 1.线程函数 在启动一个线程之前,必须为线程编写一个全局的线程函数,这个线程函数接受一个32位的LPVOID作为参数,返回一个UINT,线程函数的结构为: UINT ThreadFunction(LPVOID pParam) { //线程处理代码 return0; } 在线程处理代码部分通常包括一个死循环,该循环中先等待某事情的发生,再处理相关的工作: wh

深入浅出Win32多线程程序设计-【5】综合实例

  本章我们将以工业控制和嵌入式系统中运用极为广泛的串口通信为例讲述多线程的典型应用. 而网络通信也是多线程应用最广泛的领域之一,所以本章的最后一节也将对多线程网络通信进行简短的描述. 1.串口通信 在工业控制系统中,工控机(一般都基于PC Windows平台)经常需要与单片机通过串口进行通信.因此,操作和使用PC的串口成为大多数单片机.嵌入式系统领域工程师必须具备的能力. 串口的使用需要通过三个步骤来完成的: (1) 打开通信端口: (2) 初始化串口,设置波特率.数据位.停止位.奇偶校验等参

深入浅出Win32多线程程序设计综合实例

本章我们将以工业控制和嵌入式系统中运用极为广泛的串口通信为例讲述多线程的典型应用. 而网络通信也是多线程应用最广泛的领域之一,所以本章的最后一节也将对多线程网络通信进行简短的描述. 1.串口通信 在工业控制系统中,工控机(一般都基于PC Windows平台)经常需要与单片机通过串口进行通信.因此,操作和使用PC的串口成为大多数单片机.嵌入式系统领域工程师必须具备的能力. 串口的使用需要通过三个步骤来完成的: (1) 打开通信端口: (2) 初始化串口,设置波特率.数据位.停止位.奇偶校验等参数.

Java多线程程序设计入门

程序|多线程|设计 在Java语言产生前,传统的程序设计语言的程序同一时刻只能单任务操作,效率非常低,例如程序往往在接收数据输入时发生阻塞,只有等到程序获得数据后才能继续运行. 随着Internet的迅猛发展,这种状况越来越不能让人们忍受:如果网络接收数据阻塞,后台程序就处于等待状态而不继续任何操作,而这种阻塞是经常会碰到的,此时CPU资源被白白的闲置起来.如果在后台程序中能够同时处理多个任务,该多好啊!应Internet技术而生的Java语言解决了这个问题,多线程程序是Java语言的一个很重要