⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4-2.cpp

📁 所有的操作系统实验相当好的
💻 CPP
字号:
// mutex项目
# include <windows.h>
# include <iostream>

// 利用互斥体来保护同时访问的共享资源
class CCountUpDown
{
	public:
        // 创建者创建两个线程来访问共享值
		CCountUpDown(int nAccesses):
            m_hThreadInc(INVALID_HANDLE_VALUE),
            m_hThreadDec(INVALID_HANDLE_VALUE),
            m_hMutexValue(INVALID_HANDLE_VALUE),
            m_nValue(0),
            m_nAccess(nAccesses)
			{
				// 创建互斥体用于访问数值
				m_hMutexValue=::CreateMutex(
					NULL,			// 缺省的安全性
					TRUE,			// 初始时拥有,在所有的初始化结束时将释放
					NULL);   		// 匿名的
				m_hThreadInc=::CreateThread(
					NULL,			// 缺省的安全性
					0,				// 缺省堆栈
					IncThreadProc,	// 类线程进程
					reinterpret_cast<LPVOID>(this) ,		// 线程参数
					0,				// 无特殊的标志
					NULL);			// 忽略返回的id
                m_hThreadDec=::CreateThread(
					NULL,			// 缺省的安全性
					0,				// 缺省堆栈
					DecThreadProc,	// 类线程进程
					reinterpret_cast<LPVOID>(this) ,		// 线程参数
					0,				// 无特殊的标志
					NULL);			// 忽略返回的id

	            // 允许另一线程获得互斥体
		        ::ReleaseMutex(m_hMutexValue);
			}

        // 解除程序释放对对象的引用
		virtual ~CCountUpDown()
		{
			::CloseHandle(m_hThreadInc);
            ::CloseHandle(m_hThreadDec);
			::CloseHandle(m_hMutexValue);
		}

        // 简单的等待方法,在两个线程终止之前可暂停主调者
		virtual void WaitForCompletion()
		{
			// 确保所有对象都已准备好
			if (m_hThreadInc!=INVALID_HANDLE_VALUE && m_hThreadDec!=INVALID_HANDLE_VALUE)
			{
				// 等待两者完成 (顺序并不重要)
				::WaitForSingleObject(m_hThreadInc, INFINITE);
				::WaitForSingleObject(m_hThreadDec, INFINITE);
			}
		}

	protected:
	// 改变共享资源的简单的方法
	virtual void DoCount(int nStep)
	{
		// 循环,直到所有的访问都结束为止
		while (m_nAccess > 0)
		{
			// 等待访问数值
			:: WaitForSingleObject(m_hMutexValue, INFINITE);

			// 改变并显示该值
			m_nValue+=nStep;

			std :: cout << "thread:" << :: GetCurrentThreadId()
				<<"value:"<<m_nValue<<"access:" << m_nAccess << std :: endl;

			// 发出访问信号并允许线程切换
			--m_nAccess;
			:: Sleep(1000);

			// 释放对数值的访问
			:: ReleaseMutex(m_hMutexValue);
		}
	}

	static DWORD WINAPI IncThreadProc(LPVOID lpParam)
	{
		// 将参数解释为 "this" 指针
		CCountUpDown* pThis=reinterpret_cast<CCountUpDown*>(lpParam);

		// 调用对象的增加方法并返回一个值
		pThis -> DoCount(+1);
		return(0);
	}

	static DWORD WINAPI DecThreadProc(LPVOID lpParam)
	{
		// 将参数解释为"this"指针
		CCountUpDown* pThis = reinterpret_cast<CCountUpDown*>(lpParam);

		// 调用对象的减少方法并返回一个值
		pThis -> DoCount(-1);
		return(0);
	}

	protected:
		HANDLE m_hThreadInc;
		HANDLE m_hThreadDec;
		HANDLE m_hMutexValue;
		int m_nValue;
		int m_nAccess;
} ;

void main()
{
	CCountUpDown ud(50);
	ud.WaitForCompletion();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -