#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);
}
分享到:
相关推荐
但是,过度依赖锁或者设计不当可能导致死锁,因此在设计多线程程序时,理解并正确使用线程同步机制是非常重要的。 在压缩包文件`threadMutex`中,可能包含了关于Windows线程锁的详细使用示例、代码片段或相关的文档...
Windows群集资源死锁监控程序,发现deadlock时会直接蓝屏机器
- 同步问题:纤程间的同步和互斥需要手动管理,处理不当可能导致死锁。 综上所述,Windows纤程在需要高效并发执行和低开销的场景下有着独特的优势,但同时也伴随着额外的管理和调度复杂性。在易语言环境中实现纤程...
使用C++实现的Windows进程死锁查看工具 包含了源代码和可执行程序 使用场景: 监视进程状态 帮助快速分析进程与线程之间的关系 快速定位死锁 适合C++新手快速上手学习Windows系统层级的开发功能。
进程、线程、死锁和POSIX规范的系统调用 进程是操作系统中一个独立的执行单元,它拥有自己的虚拟地址空间和系统资源。线程是轻量级的进程,它共享同一个进程的虚拟地址空间和系统资源。理解进程和线程的概念对于...
操作系统中的死锁问题是一个复杂而重要的概念,它涉及到并发进程之间的资源分配和同步问题。死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们都将无法推进下去。这个...
从进程同步的概念可以知道,当并发进程需要竞争使用资源或需要相互协作向前推进时,如果不采取同步措施,或同步措施不恰当,则很容易导致并发进程不能向前推进而陷入僵局,即死锁现象。死锁是发生在一组相互竞争或...
进程死锁查看器是一款基于Windows的实用工具,它利用了Windows Crash Dump (WCT) API来检测和分析系统的进程死锁情况。死锁是多线程编程中一个严重的问题,当两个或多个进程互相等待对方释放资源而无法继续执行时,...
在深入探讨Linux下线程池的C语言实现之前,我们首先需要理解线程池的基本概念以及它在系统设计中的重要性。线程池是一种管理线程的机制,它预先创建一组固定数量的线程,等待任务的到来,从而避免了频繁创建和销毁...
在SQL Server数据库管理系统中,死锁是一个常见的性能问题,它发生在两个或多个事务相互等待对方释放资源,导致它们都无法继续执行。死锁不仅影响数据库的正常运行,还可能导致数据一致性问题。本文将详细介绍如何在...
4. **数据共享**:由于所有纤程都存在于同一进程的地址空间内,它们可以直接访问共享变量,但这也需要特别注意同步问题,以防止数据竞争和死锁。 5. **纤程调度策略**:作为开发者,你需要自行设计调度算法,决定...
4. **日志检查**:由于Trace文件无法提供足够的线索,作者进一步查阅了Windows日志和数据库错误日志,依然没有找到直接原因。 5. **开启跟踪标志**:为捕获更多的死锁信息,作者清空了数据库错误日志并开启了1204和...
本文将深入探讨“DB2解决表死锁”这一主题,结合提供的资源“DB2解除表锁.doc”,我们将讨论死锁的基本概念、DB2中的死锁检测、死锁预防以及如何在遇到死锁时进行有效的解决。 首先,我们要理解什么是死锁。死锁是...
MySQL数据库在处理并发事务时,可能会遇到一种特殊的情况,即死锁。死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。死锁是数据库系统中常见的问题,...
6. **同步与通信**:虽然纤程间共享内存,但仍然需要同步机制(如临界区、事件对象、信号量等)来避免竞态条件和死锁。 7. **性能优化**:通过纤程实现并发可以减少系统级线程的创建和销毁开销,提高系统的整体性能...
数据库死锁是多用户共享资源环境下常见的问题,尤其在事务处理密集的应用场景中更为突出。死锁发生时,两个或更多的事务互相等待对方释放资源,从而导致所有事务都无法继续执行,形成僵局。针对这一问题,数据库管理...
Oracle数据库解决死锁 Oracle数据库解决死锁是指在Oracle数据库中出现的死锁问题,通过使用PL/SQL语句手动解决死锁问题。死锁是当多个事务在等待其他事务释放资源时,导致系统无法继续执行的现象。 在Oracle...
Oracle数据库在运行过程中,由于多个事务间的资源竞争,可能会出现死锁现象,导致某些事务无法继续执行。"Oracle死锁查杀PB版"是专为解决这类问题而设计的工具,它提供了便捷的方法来检测和解除数据库中的死锁。本文...
死锁典型例题集锦 在操作系统原理中,死锁是一个非常重要的概念。死锁的出现可能会导致系统崩溃,因此了解死锁是非常必要的。本文总结了四个典型的死锁例题,旨在帮助读者更好地理解死锁的计算类题目。 例 1:死锁...