当前位置:编程学习 > C/C++ >>

互斥对象、事件对象、关键代码段

最近复习了一下多线程的知识


作用差不多,侧重点不一样

临界区:  共享资源
互斥对象  线程间的同步
事件对象:一般用在比较复杂的地方,能够传递一些信息


下面是互斥对象、事件对象和关键代码段的比较:

1互斥对象


[cpp]
#include <iostream>  
#include <windows.h>  
using namespace std; 
 
// 声明两个线程函数  
DWORD WINAPI ThreadProc1( 
                        LPVOID lpParameter   // thread data  
                        ); 
 
DWORD WINAPI ThreadProc2( 
                        LPVOID lpParameter   // thread data  
                        ); 
 
// 全局票数  
int gTicket = 100; 
 
// 互斥对象  
HANDLE hMutex; 
 
int main() 

    // 创建两个线程句柄  
    HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); 
    HANDLE hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL); 
 
    // 创建互斥对象  
    hMutex = CreateMutex(NULL, false, NULL); 
 
    // 关闭两个线程句柄  
    CloseHandle(hThread1); 
    CloseHandle(hThread2); 
 
    // 主线程睡4秒,方便两个线程函数能够获取CPU时间片  
    Sleep(4000); 
 
    system("pause"); 
    return 0; 

 
// 定义两个线程函数  
DWORD WINAPI ThreadProc1(LPVOID lpParameter ) 

    while(true) 
    { 
        WaitForSingleObject(hMutex, INFINITE); 
        if(gTicket > 0) 
        { 
            cout<<"thread1 sell ticket "<<gTicket--<<endl; 
        } 
        else 
        { 
            break; 
        } 
        ReleaseMutex(hMutex); 
    } 
    return 0; 

 
DWORD WINAPI ThreadProc2(LPVOID lpParameter ) 

    while(true) 
    { 
        WaitForSingleObject(hMutex, INFINITE); 
        if(gTicket > 0) 
        { 
            cout<<"thread2 sell ticket "<<gTicket--<<endl; 
        } 
        else 
        { 
            break; 
        } 
        ReleaseMutex(hMutex); 
    } 
    return 0; 

#include <iostream>
#include <windows.h>
using namespace std;

// 声明两个线程函数
DWORD WINAPI ThreadProc1(
      LPVOID lpParameter   // thread data
      );

DWORD WINAPI ThreadProc2(
      LPVOID lpParameter   // thread data
      );

// 全局票数
int gTicket = 100;

// 互斥对象
HANDLE hMutex;

int main()
{
 // 创建两个线程句柄
 HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
 HANDLE hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);

 // 创建互斥对象
 hMutex = CreateMutex(NULL, false, NULL);

 // 关闭两个线程句柄
 CloseHandle(hThread1);
 CloseHandle(hThread2);

 // 主线程睡4秒,方便两个线程函数能够获取CPU时间片
 Sleep(4000);

 system("pause");
 return 0;
}

// 定义两个线程函数
DWORD WINAPI ThreadProc1(LPVOID lpParameter )
{
 while(true)
 {
  WaitForSingleObject(hMutex, INFINITE);
  if(gTicket > 0)
  {
   cout<<"thread1 sell ticket "<<gTicket--<<endl;
  }
  else
  {
   break;
  }
  ReleaseMutex(hMutex);
 }
 return 0;
}

DWORD WINAPI ThreadProc2(LPVOID lpParameter )
{
 while(true)
 {
  WaitForSingleObject(hMutex, INFINITE);
  if(gTicket > 0)
  {
   cout<<"thread2 sell ticket "<<gTicket--<<endl;
  }
  else
  {
   break;
  }
  ReleaseMutex(hMutex);
 }
 return 0;
}

 


2事件对象

[cpp]
#include <Windows.h>  
#include <iostream>  
using namespace std; 
 
// 声明两个线程函数  
DWORD WINAPI ThreadProc1( 
                         LPVOID lpParameter   // thread data  
                         ); 
 
DWORD WINAPI ThreadProc2( 
                         LPVOID lpParameter   // thread data  
                         ); 
 
// 全局变量  
int gTicket = 100; 
 
// 事件对象  
HANDLE hEvent; 
 
int main() 

    // 创建两个线程句柄  
    HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); 
    HANDLE hThread2 = CreateThread(NULL, 0, Thread

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,