多线程同步:互斥对象、事件对象、关键代码段
来源:互联网 发布:linux查询cpu和内存 编辑:程序博客网 时间:2024/05/21 08:02
计算机指令的集合,它以文件的形式存储在磁盘上
通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动
区别:进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立的运行的单位,
- 进程由两个部分组成:
内核对象:是操作系统内部分配的一个内存块,它是一种只能被内核访问的数据结构,
- 进程
进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。
若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。
单个进程可能包含若干个线程,这些线程都“同时”执行进程地址空间中的代码。
每个进程至少拥有一个线程,来执行进程的地址空间中的代码。
当创建一个进程时,操作系统会自动创建这个进程的一个线程,称为主线程。此后,该线程可以创建其他的线程
- 线程
线程有两个部分组成:
当创建线程时,系统创建一个线程内核对象。
该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。
可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。
线程总是在某个进程环境中创建。
系统从进程的地址空间中分配内存,供线程的堆栈使用。
新线程运行的进程环境与创建线程的环境相同。
因此,新线程可以访问进程的内核对象的所有句柄、进程中的所有内存和在这个相同的进程中的所有其他线程的堆栈。这使得单个进程中的多个线程确实能够非常容易的互相通信。
线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需要的内存也很少。
因为线程需要的开销比进程少,因此在编程中经常采用多线程来解决编程问题,而尽量避免创建新的进程。
- 线程运行
对于单个CPU
操作系统为每一个运行线程安排一定的CPU时间——时间片。
系统通过一种循环的方式为线程提供时间片,线程在自己的时间内运行,因时间片相当短,因此,给用户的感觉,就好像线程是同时进行的一样。
如果计算机拥有多个CPU,线程就能真正意义上运行了
- 注意
一、互斥对象
这种办法不适合在多核CPU的电脑上 。自动重置(只有一个线程可以得到事件对象)
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc (LPVOID lpParameter);
DWORD WINAPI Fun2Proc (LPVOID lpParameter);
int index=0;
int tickets=100;
HANDLE hMutex;
void main()
{
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
}
DWORD WINAPI Fun2Proc (LPVOID lpParameter)
{
}
二、事件对象
这种办法不适合在多核CPU的电脑上 。自动重置(只有一个线程可以得到事件对象)
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc (LPVOID lpParameter);
DWORD WINAPI Fun2Proc (LPVOID lpParameter);
int tickets=100;
HANDLE g_hEvent;
void main()
{
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
}
DWORD WINAPI Fun2Proc (LPVOID lpParameter)
{
}
三、关键代码段
使用关键代码段的线程同步代码:
#include <windows.h>
#include <iostream.h>
#include <stdio.h>
DWORD WINAPI Fun1Proc (LPVOID lpParameter);
DWORD WINAPI Fun2Proc (LPVOID lpParameter);
int tickets=100;
CRITICAL_SECTION g_cs;
void main()
{
//
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
}
DWORD WINAPI Fun2Proc (LPVOID lpParameter)
{
}
三、线程死锁问题:
#include <windows.h>
#include <iostream.h>
#include <stdio.h>
DWORD WINAPI Fun1Proc (LPVOID lpParameter);
DWORD WINAPI Fun2Proc (LPVOID lpParameter);
int tickets=100;
CRITICAL_SECTION g_csA;
CRITICAL_SECTION g_csB;
void main()
{
//
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
//
}
DWORD WINAPI Fun2Proc (LPVOID lpParameter)
{
}
- 多线程同步:互斥对象、事件对象、关键代码段
- 多线程同步:互斥对象、事件对象、关键代码段
- VC++多线程,互斥对象,事件对象,关键代码段实现线程同步
- windows下多线程同步(利用事件对象,互斥对象,关键代码段)实现
- 互斥对象、事件对象、关键代码段
- 互斥对象、事件对象与关键代码段
- 互斥对象 事件对象 关键代码段的比较
- C++多线程:互斥对象、事件对象与关键代码段的比较
- 互斥对象、事件对象与关键代码段的比较
- 互斥对象、事件对象、关键代码段的应用和比较
- 互斥对象、事件对象、关键代码段的应用和比较
- 互斥对象、事件对象、与关键代码段的比较
- 事件对象(CreateEvent)、互斥对象(CreateMutex)、关键代码段(InitializeCriticalSection)
- 互斥对象、事件对象、关键代码段的应用和比较
- 多线程同步的三种方法-互斥量-事件对象-关键代码段(临界区)
- C++ 事件对象 多线程同步互斥
- C++ 事件对象 多线程同步互斥
- 互斥对象与关键代码段的比较
- PL/SQL中 块与过程的记录笔记
- MySQL创建用户与授权
- 获取VS2012离线语言包
- git 官方教程 gittutorial(7) Manual Page
- python学习的读书路线
- 多线程同步:互斥对象、事件对象、关键代码段
- srs之时间戳矫正算法(混合单增算法,mix_correct to ensure timestamp monotonically increase)
- ElasticSearch@Windows使用指南
- android 6.0-高通视频通话拨打流程
- 基于SOA的解决方案的基础不断扩大
- Unity3D C# 简单的倒计时
- Android Studio混淆模板及常用第三方混淆(看了都说好)
- 关于线程局部存储代码出错分析讨论
- JS数组,字典