windows 多线程

多线程意义:

单核cpu 系统会为每个线程分配一个时间片,时间片执行完了,就会让其他线程执行

多核cpu  系统会同时执行几个线程

单核:在主线程中创建一个子线程,创建完了,子线程为什么没有执行。因为主线程还在时间片内,所以不会执行子线程。

时间片内主线程会一直执行,直到执行完返回,主线程即进程,执行完了,所有的资源和线程都会被关闭,所以创建的线程就不会执行。

怎么才能让创建完的子线程执行呢?

我们只需 sleep(100) sleep一个时间,主线程这段时间就不会执行,新建的子线程就会执行。执行完会返回到主线程,主线程继续执行。

如果是多核的话:不需要sleep  创建的线程也会执行。

如果分配给线程的时间片到期了,执行权力就会给其他线程。就会断掉,但是系统会记录断掉的位置,任何地方都有可能断,不管是循环或是判断语句,其他的线程执行完了,就会返回给当前线程,接着刚才的地方执行。所以这里很容易出现问题,比如变量的值或其他已经改变,这里没做处理就会出来问题。

模拟这种断,只需要在想断的地方加入sleep(1)   就可以断掉

所以这里就涉及到线程之间数据同步

互斥对象  

用法:创建一个互斥对象,waitForsignalObject(等待一个互斥对象),release(释放一个互斥对象),等待一个互斥对象如果该互斥对象被其他线程拥有,该线程就会等待不会执行(这里的等待,应该会等待,直到时间片执行完毕,另个线程会继续执行),直到互斥对象可以使用时才会继续向下执行。 等待一个互斥对象,一般放在保护代码的前面,release一般放在关键的代码执行完毕的时候。

互斥对象的管理:是通过引用计数来管理的,当期线程拥有该互斥对象,还调用waitfor... 就会使互斥对象+1,

互斥对象释放,只有当前线程(因为互斥对象记录了当前线程的ID)才能释放。释放之后-1, 为0之后就不会拥有该互斥对象,这时互斥对象就处于有信号状态。  如果该线程结束(主动结束或返回),就会释放互斥对象。 waitfor..的返回值,可以判断该互斥对象是异常终止还是主动终止。

可以利用互斥对象,来限制只能有一个程序运行。

事件对象

分为人工重置事件对象,与自动重置事件对象

人工重置事件对象,有信号状态后,会调度所有的等待线程,当前线程获得当前事件对象,需要手动设置事件对象的信号

自动重置事件对象,有信号状态后,只会调度一个线程,操作系统会自动把事件对象设置为无信号,只需在需要的地方设置有信号就可以了。

关键代码段(临界区)

EnterCriticalSection等待临界区(判断是否可用,可用获取临界区)

InitializeCriticalSection 初始化临界区

LeaveCriticalSection 离开临界区

DeleteCriticalSection 释放临界区

线程死锁

两个线程,有两个临界区(互斥对象或事件对象),

线程1

EnterCriticalSection(A)

sleep(1)    模拟出错

EnterCriticalSection(B)

线程2

EnterCriticalSection(B)

sleep(1)    模拟出错

EnterCriticalSection(A)

这样就造成了死锁

线程1获取A 取得A的拥有权 sleep(1)   会让线程2执行 线程2获得B的所有权

sleep(1) 线程1执行 线程1接着执行,等待B信号, 但是B信号已经被线程2拥有 所以他取得不到 然后一直等待

线程2继续执行 等待A信号,但是A信号被线程1拥有,所以他将一直等待下去

这样程序就不会继续执行了 造成死锁

3种同步方式区别

参考:孙鑫vc++视频 15 16课

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-29 16:21:20

windows 多线程的相关文章

Windows多线程编程总结

Windows 多线程编程总结 keyword:多线程 线程同步 线程池 内核对象 1 内核对象 1 .1 内核对象的概念 内核对象是内核分配的一个内存块,这样的内存块是一个数据结构,表示内核对象的各种特征.而且仅仅能由内核来訪问.应用程序若须要訪问内核对象,须要通过操作系统提供的函数来进行,不能直接訪问内核对象( Windows 从安全性方面来考虑的). 内核对象通过 Create* 来创建,返回一个用于标识内核对象的句柄,这些句柄 (而不是内核对象)可在创建进程范围内使用,不可以被传递到其它

windows多线程同步

概述 任何单个应用程序都不能完全使该处理器达到满负荷.当一个线程遇到较长等待时间事件时,同步多线程还允许另一线程中的指令使用所有执行单元.例如,当一个线程发生高速缓存不命中,另一个线程可以继续执行.同步多线程是 POWER5? 和 POWER6? 处理器的功能,可与共享处理器配合使用. SMT 对于商业事务处理负载的性能优化可达30%.在更加注重系统的整体吞吐量而非单独线程的吞吐量时,SMT 是一个很好地选择. 但是并非所有的应用都能通过SMT 取得性能优化.那些性能受到执行单元限制的应用,或者

windows多线程接口介绍和使用

一windows多线程接口: 1 创建线程 CreateThread 与 _beginthreadex都可以实现创建线程,两个函数的参数 相同, HANDLEWINAPICreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThr

Windows多线程编程及常见问题

提要: Windows 多线程Helloworld 以Windows代码为例,分析多线程编程中易出现的问题 Windows多线程的Helloworld: 笔者写过Java多线程的程序(实现Runnable接口,利用Thread类执行),也写过Linux多线程程序(利用pthread).最近由于另有需要使用Windows多线程,由于Windows API历来难用,特此记录,以作备忘. Helloworld源代码如下: 1 #include <stdio.h> 2 #include <win

Windows多线程多任务设计初步(转)

Windows多线程多任务设计初步 [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的应用软件无一不是多线程多任务处理,单线城的软件是不可想象的.因此掌握多线程多任务设计方法对每个程序员都是必需要掌握的.本文针对多线程技术在应用中经常遇到的问题,如

【APUE】关于windows多线程编程的学习笔记

保证在某一时刻只有一个线程对数据进行操作的基本方法: (1)关中断:通过关闭时钟中断来停止线程调度(不现实) (2)数学互斥方法:Peterson算法 bakery算法 (3)操作系统提供的互斥方法:临界区.互斥量.信号量等(windows) (4)cpu原子操作:把一些常用的指令设计成了原子指令,在windows上面也被称为原子锁 [APUE]关于windows多线程编程的学习笔记

Windows多线程开发之并发线程程序研究

做为一名分布式服务器开发人员,在服务器开发领域.多线程开发和并发编程方面有自己的心得和经验,愿意分享给同仁,今讨论下Windows下线程并发程序开发. 下面用用两个线程实现一个简单的数组排序,演示了线程的基本用法. 原理是: 为了节省执行时间而添加并行,把问题划分为几个小问题,并分配给几个线程(分而治之),把问题划分成若干更小的单元,更容易在实现中创建并行逻辑.同时,在并行中使用系统资源能优化应用程序并提高其运行速度. #include "stdafx.h"  #include <

Windows多线程初探

线程是进程中的一个执行单位(每个进程至少有一个主线程),一个进程可以有多个线程,而一个线程只存在于一个进程中.在数据关系上属于一对多的关系.线程不占有系统资源,它所使用的资源全部由所属进程向系统申请. 在多处理器中,不同的线程可以同时运行在不同的CPU上,这样可以提高程序的运行效率.除此之外,有些时候必须使用多线程.例如,杀毒软件在查杀病毒的时候,它需要一边扫描相关的磁盘文件,一边显示当前的扫描进度以及发现的问题.如果把这几个工作放在一个线程中执行,会让程序看上去像卡住一样.在这种情况下,分为多

Windows多线程问题

进程和线程是操作系统里面经常遇到的两个概念,还有一个概念,是应用程序.应用程序包括指令和数据,在开始运行之前,只是分布在磁盘上的指令和数据.正在执行的应用程序称为进程,进程不仅仅是指令和数据,它还有状态.状态是保存在处理器寄存器中的一些值,记录一些信息,比如说当前执行指令的地址,保存在内存中的值等.进程是应用程序的基本构件块,同时运行的多个应用程序就是多个进程.每个进程可以运行多个线程.线程也有一些状态,但线程的状态基本上只是保存在其寄存器中的值以及其栈上的数据.线程与同一个应用程序中的其他线程

windows多线程编程(一)(转)

源出处:http://www.cnblogs.com/TenosDoIt/archive/2013/04/15/3022036.html CreateThread:Windows的API函数(SDK函数的标准形式,直截了当的创建方式,任何场合都可以使用),提供操作系统级别的创建线程的操作,且仅限于工作者线程 beginthread beginthreadex:MS对C Runtime库的扩展SDK函数,首先针对C Runtime库做了一些初始化的工作,以保证C Runtime库工作正常,然后,调