`
mylove2060
  • 浏览: 335341 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

windows下线程死锁

 
阅读更多
#include <stdio.h>

#include <numeric>
#include <vector>
#include <string>
#include <map>
#include <iostream>
#include "windows.h"

using namespace std;


CRITICAL_SECTION cs1;

CRITICAL_SECTION cs2;

CRITICAL_SECTION csprint;

//初始化关键代码段

void InitMyCriticalSection();

//删除关键代码段

void DeleteMyCriticalSection();

//打印信息

void PrintString(const char* pData);
DWORD WINAPI Thread1(LPVOID lpParameter);

DWORD WINAPI Thread2(LPVOID lpParameter);

int main(char* argv[], char* envp[])

{

	int nRetCode = 0;

	//初始化关键代码段

	InitMyCriticalSection();

		//创建线程

	HANDLE hThread1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);

	HANDLE hThread2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);

	//等待线程结束

	WaitForSingleObject(hThread1, INFINITE);

	WaitForSingleObject(hThread2, INFINITE);

	//关闭线程句柄

	CloseHandle(hThread1);

	CloseHandle(hThread2);

	//释放关键代码段

	DeleteMyCriticalSection();

	return nRetCode;

}

void InitMyCriticalSection()

{

	InitializeCriticalSection(&cs1);
	InitializeCriticalSection(&cs2);
	InitializeCriticalSection(&csprint);

}

void DeleteMyCriticalSection()

{

	DeleteCriticalSection(&cs1);

	DeleteCriticalSection(&cs2);

	DeleteCriticalSection(&csprint);

}

DWORD WINAPI Thread1(LPVOID lpParameter)
{
	for (int i = 0; i < 5; i++)
	{
		EnterCriticalSection(&cs1);
		Sleep(500);
		EnterCriticalSection(&cs2);

		PrintString("Thread1");

		LeaveCriticalSection(&cs2);

		LeaveCriticalSection(&cs1);

	}
	return 1;
}

DWORD WINAPI Thread2(LPVOID lpParameter)
{

	for (int i = 0; i < 5; i++)
	{

		EnterCriticalSection(&cs2);

		Sleep(500);

		EnterCriticalSection(&cs1);

		PrintString("Thread2");

		LeaveCriticalSection(&cs1);

		LeaveCriticalSection(&cs2);
	}

	return 1;

}

void PrintString(const char* pData)
{

	EnterCriticalSection(&csprint);
	std::cout<<pData<<std::endl;
	LeaveCriticalSection(&csprint);

}

分享到:
评论

相关推荐

    windows下线程锁

    但是,过度依赖锁或者设计不当可能导致死锁,因此在设计多线程程序时,理解并正确使用线程同步机制是非常重要的。 在压缩包文件`threadMutex`中,可能包含了关于Windows线程锁的详细使用示例、代码片段或相关的文档...

    Windows群集资源死锁监控程序

    Windows群集资源死锁监控程序,发现deadlock时会直接蓝屏机器

    Windows纤程.rar

    - 同步问题:纤程间的同步和互斥需要手动管理,处理不当可能导致死锁。 综上所述,Windows纤程在需要高效并发执行和低开销的场景下有着独特的优势,但同时也伴随着额外的管理和调度复杂性。在易语言环境中实现纤程...

    使用C++实现的Windows进程死锁查看工具

    使用C++实现的Windows进程死锁查看工具 包含了源代码和可执行程序 使用场景: 监视进程状态 帮助快速分析进程与线程之间的关系 快速定位死锁 适合C++新手快速上手学习Windows系统层级的开发功能。

    进程线程及死锁

    进程、线程、死锁和POSIX规范的系统调用 进程是操作系统中一个独立的执行单元,它拥有自己的虚拟地址空间和系统资源。线程是轻量级的进程,它共享同一个进程的虚拟地址空间和系统资源。理解进程和线程的概念对于...

    操作系统实验六 死锁问题实验

    操作系统中的死锁问题是一个复杂而重要的概念,它涉及到并发进程之间的资源分配和同步问题。死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们都将无法推进下去。这个...

    操作系统-死锁

    从进程同步的概念可以知道,当并发进程需要竞争使用资源或需要相互协作向前推进时,如果不采取同步措施,或同步措施不恰当,则很容易导致并发进程不能向前推进而陷入僵局,即死锁现象。死锁是发生在一组相互竞争或...

    进程死锁查看器

    进程死锁查看器是一款基于Windows的实用工具,它利用了Windows Crash Dump (WCT) API来检测和分析系统的进程死锁情况。死锁是多线程编程中一个严重的问题,当两个或多个进程互相等待对方释放资源而无法继续执行时,...

    Linux下线程池的C语言实现

    在深入探讨Linux下线程池的C语言实现之前,我们首先需要理解线程池的基本概念以及它在系统设计中的重要性。线程池是一种管理线程的机制,它预先创建一组固定数量的线程,等待任务的到来,从而避免了频繁创建和销毁...

    sqlserver如何快速查询死锁语句

    在SQL Server数据库管理系统中,死锁是一个常见的性能问题,它发生在两个或多个事务相互等待对方释放资源,导致它们都无法继续执行。死锁不仅影响数据库的正常运行,还可能导致数据一致性问题。本文将详细介绍如何在...

    Windows纤程易语言源码

    4. **数据共享**:由于所有纤程都存在于同一进程的地址空间内,它们可以直接访问共享变量,但这也需要特别注意同步问题,以防止数据竞争和死锁。 5. **纤程调度策略**:作为开发者,你需要自行设计调度算法,决定...

    一次死锁追踪经历

    4. **日志检查**:由于Trace文件无法提供足够的线索,作者进一步查阅了Windows日志和数据库错误日志,依然没有找到直接原因。 5. **开启跟踪标志**:为捕获更多的死锁信息,作者清空了数据库错误日志并开启了1204和...

    DB2解决表死锁

    本文将深入探讨“DB2解决表死锁”这一主题,结合提供的资源“DB2解除表锁.doc”,我们将讨论死锁的基本概念、DB2中的死锁检测、死锁预防以及如何在遇到死锁时进行有效的解决。 首先,我们要理解什么是死锁。死锁是...

    mysql死锁的一些案例

    MySQL数据库在处理并发事务时,可能会遇到一种特殊的情况,即死锁。死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。死锁是数据库系统中常见的问题,...

    Windows纤程易语言源码.zip

    6. **同步与通信**:虽然纤程间共享内存,但仍然需要同步机制(如临界区、事件对象、信号量等)来避免竞态条件和死锁。 7. **性能优化**:通过纤程实现并发可以减少系统级线程的创建和销毁开销,提高系统的整体性能...

    数据库死锁-解决死锁问题的三种办法

    数据库死锁是多用户共享资源环境下常见的问题,尤其在事务处理密集的应用场景中更为突出。死锁发生时,两个或更多的事务互相等待对方释放资源,从而导致所有事务都无法继续执行,形成僵局。针对这一问题,数据库管理...

    oracle数据库解决死锁

    Oracle数据库解决死锁 Oracle数据库解决死锁是指在Oracle数据库中出现的死锁问题,通过使用PL/SQL语句手动解决死锁问题。死锁是当多个事务在等待其他事务释放资源时,导致系统无法继续执行的现象。 在Oracle...

    orcale死锁查杀PB版

    Oracle数据库在运行过程中,由于多个事务间的资源竞争,可能会出现死锁现象,导致某些事务无法继续执行。"Oracle死锁查杀PB版"是专为解决这类问题而设计的工具,它提供了便捷的方法来检测和解除数据库中的死锁。本文...

    死锁典型例题,对理解死锁的计算类题目有帮助

    死锁典型例题集锦 在操作系统原理中,死锁是一个非常重要的概念。死锁的出现可能会导致系统崩溃,因此了解死锁是非常必要的。本文总结了四个典型的死锁例题,旨在帮助读者更好地理解死锁的计算类题目。 例 1:死锁...

Global site tag (gtag.js) - Google Analytics