1. 线程上下文:线程内核对象保存线程上一次执行时的CPU寄存器状态

2. 线程上下文切换

3. windows操作系统为抢占式多线程操作系统,系统可以在任何时刻停止一个线程而另行调度另外一个线程。我们无法保证

线程总在运行,无法保证线程会获得整个处理器而不运行运行其他线程等。

4. 系统只调度可调度的线程,系统中大多数线程都是不可调度的,比如挂起(SUSPENDED)线程或等待线程(等待某些事件发生,

如键盘输入)

5. 枚举线程

CreateToolhelp32Snapshot  Thead32First  Thread32Next

6. 线程的执行时间

在抢占式操作系统中,我们不可能知道线程什么时候会获得CPU时间,当线程失去CPU时间时,为线程执行的各种任务进行计时很

困难。我们需要的是一个能够返回线程已获得的CPU时间量的函数GetThreadTimes

精度更高的有:QueryPerformanceFrequency和QueryPerformanceCounter

当线程被调度程序暂停时将计算此时TSC值与线程开始执行时间量时的TSC值之差,并在线程执行时间上加上这个差值,不计算中断时间

  

//typedef struct _FILETIME
//{
//	DWORD dwLowDateTime;
//	DWORD dwHighDateTime;
//}	FILETIME;

// 设计概念逻辑左移动和算术左移
INT64 FileTimeToQuadWord(FILETIME* pft)
{
	return (Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}

// 函数无法检测
void PerformLongOperation()
{
	FILETIME ftCreateTime;
	FILETIME ftExitTime;
	FILETIME ftKernelTimeStart;
	FILETIME ftKernelTimeEnd;
	FILETIME ftUserStart;
	FILETIME ftUserEnd;
	INT64 qwKernelTimeElapsed, qwUserTimeElapsed, qwTotalTimeElapsed;

	GetThreadTimes(GetCurrentThread(), &ftCreateTime, &ftExitTime, &ftKernelTimeStart, &ftUserStart);
	// 进行一系列操作
	for ( int i = 0; i < 100; i ++)
	{
		int j = i;
	}
	GetThreadTimes(GetCurrentThread(), &ftCreateTime, &ftExitTime, &ftKernelTimeEnd, &ftUserEnd);

	qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd) - FileTimeToQuadWord(&ftKernelTimeStart);
	qwUserTimeElapsed = FileTimeToQuadWord(&ftUserEnd) - FileTimeToQuadWord(&ftUserStart);
	qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;
}

  

class CStopwatch
{
private:
	// 64位有符号整数可以用INT64 _int64 LARGE_INTEGER表示
	LARGE_INTEGER m_nPerfFrequency;
	LARGE_INTEGER m_nPerFrefStart;

public:
	CStopwatch(){QueryPerformanceFrequency(&m_nPerfFrequency); Start();}

	void Start(){QueryPerformanceCounter(&m_nPerFrefStart);}

	INT64 Now() const
	{
		LARGE_INTEGER nPerfNow;
		QueryPerformanceCounter(&nPerfNow);
		return ((nPerfNow.QuadPart - m_nPerFrefStart.QuadPart) * 1000) / m_nPerfFrequency.QuadPart;
	}

	INT64 NowInMicro() const
	{
		LARGE_INTEGER nPerfNow;
		QueryPerformanceCounter(&nPerfNow);
		return ((nPerfNow.QuadPart - m_nPerFrefStart.QuadPart) * 1000000) / m_nPerfFrequency.QuadPart;
	}
};

  

7. CONTEXT结构分以下及部分:

CPU控制寄存器:指令指针、栈指针、标志和函数返回地址等

CPU整数寄存器

CPU浮点数寄存器

CPU段寄存器

CPU调试寄存器

CPU扩展寄存器

8. 用户模式下线程同步

1). 原子访问InterLocked系列函数,无论编译器如何生成代码,无论机器上装配了多少个CPU,这些函数都能保证对值的修改是以原子方式进行的。

但是我们必须保证传给这些函数的变量地址是对齐的,否则这些函数可能会失败。

2). 注意原子系列函数返回的是原来的值

3). 关键段CRITICAL_SECTION

CRITICAL_SECTION g_cs;

EnterCriticalSection(&g_cs);

    LeaveCriticalSection(&g_cs);

4). SRWLOCK读/写锁

InitializeSRWLOCK(PSRWLOCK SRWLock);

// 独占方式写入者线程

AcquireSRWLockExclusive(PSRWLOCK SRWLock);

ReleaseSRWLockExclusive(PSRWLOCK SRWLock);

    // 共享方式读取者线程

AcquireSRWLockShared(PSRWLOCK SRWLock);

ReleaseSRWLockShared(PSRWLOCK SRWLock);

5). 条件变量

BOOL SleepConditionVariableCS(PCONDITIONVARIABLE pConditionVariable, PCRITICAL_SECTION pCriticalSection, DWORD dwMillseconds);

BOOL SleepConditionVariableCS(PCONDITIONVARIABLE pConditionVariable, PSRWLOCK pSRWLock, DWORD dwMillseconds, ULONG Flags);

Flags: 对写入者线程来说应该传入0,表示希望以独占的方式对资源访问

CONDITION_VARIABLE_LOCKMODE_SHARED 表示希望共享对资源的访问

9. 高速缓存行

虽然高速缓存行存在提高性能,但在多处理器的机器上他们能够损伤性能

  

_declspec (align(32)) struct data
{
	int a;
	char cBuff[100];

	_declspec (align(64))
	double d;
	int c;
};

  

附录:

elapsed  失去过去 elapsedtime

query   询问 QueryPerformanceFrequency

conditionvariable 条件变量

void* _aligned_malloc(size_t size, size_t alignment);   分配一块对齐过的内存

LONG InterlockedExchangeAdd(PLONG volatile plAddend, LONG lIncrement);

LONG InterlockedExchange(PLONG volatile plTarget, LONG lValue);

PVOID InterlockedExchangePointer(PVOID* volatile ppvTarget, PVOID pvValue);

LPCOID HeadAlloc(HEADLE hHeap, DWORD dwFlag, SIZE_T dwBytes);

参数1可以通过GetProcessHeap()获得

参数2 HEAP_GENERATE_EXCEPTIONS 如果分配错误将会抛出异常而不是返回NULL

HEAP_NO_SERIALIZE 不实用连续存储

HEAP_ZERO_MEMORY 将分配的内存全部清零

Windows核心编程&线程的更多相关文章

  1. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  2. windows核心编程 - 线程基础

    一.基本概念: 一个进程至少需要一个线程. 组成:一个线程包括仅包括一个线程堆栈和一个线程内核对象 线程堆栈:用于维护线程在执行代码时需要的所有函数参数和局部变量 线程内核对象:操作系统用它来对线程实 ...

  3. windows核心编程---第八章 使用内核对象进行线程同步

    使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...

  4. 【windows核心编程】 第八章 用户模式下的线程同步

    Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ①    需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ②    一个线程需要通知其他线程 ...

  5. 【windows核心编程】 第六章 线程基础

    Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ①    一个是线程的内核 ...

  6. Windows核心编程学习九:利用内核对象进行线程同步

    注:源码为学习<Windows核心编程>的一些尝试,非原创.若能有助于一二访客,幸甚. 1.程序框架 #include "Queue.h" #include <t ...

  7. 《windows核心编程系列》十九谈谈使用远程线程来注入DLL。

    windows内的各个进程有各自的地址空间.它们相互独立互不干扰保证了系统的安全性.但是windows也为调试器或是其他工具设计了一些函数,这些函数可以让一个进程对另一个进程进行操作.虽然他们是为调试 ...

  8. 用户模式下的线程同步的分析(Windows核心编程)

    线程同步 同一进程或者同一线程可以生成许多不同的子线程来完成规定的任务,但是多个线程同时运行的情况下可能需要对某个资源进行读写访问,比如以下这个情况:创建两个线程对同一资源进行访问,最后打印出这个资源 ...

  9. CreateThread 线程操作与 _beginthreadex 线程安全(Windows核心编程)

    0x01 线程的创建 线程不同于进程,Windows 中的进程是拥有 '惰性' 的,本身并不执行任何代码,而执行代码的任务转交给主线程,列如使用 CreateProcess 创建一个进程打开 Cmd ...

随机推荐

  1. FFmpeg AVPacket

    AVPacket注解 AVPacket 是一个结构体,存储压缩数据.可作为编码器的输出,解码器的输入. 对于 Video 一般包含一个压缩帧,对于 Audio 可能包含多个压缩帧. 编码器允许输出空 ...

  2. linux 常见操作指令

    1.ssh root@ip ssh 登录 2.ll ls 列出当文件夹下 所以文件 3. cd ./xx 进入 xx 文件夹 4. vim vi xxx 进入 xx文件的 编辑模式. i 开始编辑 e ...

  3. JS CKEditor使用setData后绑定click事件

    CKEditor使用setData()时会自动丢失初始时绑定的时间,在百度时发现有很多方法都不对. 近期在做项目的时候,由于客户需要,将原来的文本格式的textarea标签更改成富文本编辑器--CKE ...

  4. centos设置程序开机自启或禁止加载

    1. 可以直接把需要启动的脚本写到/etc/rc.d/rc.local文件里,例如 vim /etc/rc.d/rc.local /usr/local/apache/bin/apachectl sta ...

  5. JavaScript图片库(简单的应用案例)

    这个图片库小例子的效果如图所示,点击网页上某个图片链接时你将看到两种效果:占位符图片呗替换成这个链接所指向的图片,同时描述性文字也被替换为这个链接的title属性值.     利用一个简单的图片库应用 ...

  6. WebGL多模型光照综合实例

      原文地址:WebGL多模型光照综合实例   WebGL是一个非常的接近硬件底层的光栅化API, 从非常类似C/C++风格的API调用方式就可以看出来, 习惯了高级语言的我们会觉得很不友好,觉得特别 ...

  7. http常见状态码含义

    200:请求成功 301:请求的资源已永久移动到新位置 302:请求的资源临时移动到新位置 304:请求内容无改变 401:未授权 403:禁止访问 404:文件未找到 500:服务器内部错误 501 ...

  8. 使用 GStreamer appsrc 等插件实现视频音频混流,录制和推流

    目前在做的在线直播教室,需要将老师分享的屏幕和老师的声音.学生的声音录制为一个视频文件,以便学生上课后还可以再看回放. 直播服务我们采用的是腾讯的视频服务,有现成的 SDK 可以用.但 SDK 自带的 ...

  9. Codeforces 789A Anastasia and pebbles(数学,思维题)

    A. Anastasia and pebbles time limit per test:1 second memory limit per test:256 megabytes input:stan ...

  10. HDU2825 Wireless Password

    Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...