Windows 下多線程編程

來源:互聯網
上載者:User
文章目錄
  • 一、CreateThread()和 WaitForSignalObject()的用法
  • 二、線程互斥處理【轉載】
一、CreateThread()和 WaitForSignalObject()的用法
#include "windows.h"#include "stdio.h"void Scan(char* str){printf("%s",str);Sleep(4000);}void main(){char* s="NBA YAO YEAR!\n";HANDLE hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Scan,s,0,NULL);WaitForSingleObject(hThread, INFINITE);return ;}/*參數說明: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,//必須為NULL ,線程的安全性DWORD dwStackSize,                      //一般為0 ,表示堆棧與外部大小相同 ,線程的深度LPTHREAD_START_ROUTINE lpStartAddress, //線程函數名稱 LPVOID lpParameter,                   //傳遞給線程函數的參數,如果為多個,自訂結構體 DWORD dwCreationFlags,//0表示建立線程後立即啟動線程,如果不是立即啟動需要調用ResumeThread函數 LPDWORD lpThreadId); //用來標記該線程的名稱 DWORD WaitForSingleObject(  HANDLE hHandle,        // handle to object to wait for  DWORD dwMilliseconds   // time-out interval in milliseconds);                       //等待hThread線程結束,INFINITE無時間限制*/

 

二、線程互斥處理【轉載】
#include <windows.h>   #include <iostream.h>   DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread data   DWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread data     int index=0;  int tickets=10;  HANDLE hMutex;  void main()  {      HANDLE hThread1;      HANDLE hThread2;      //建立線程       hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);      hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);      CloseHandle(hThread1);      CloseHandle(hThread2);    
    //建立互斥對象   
    hMutex=CreateMutex(NULL,TRUE,"tickets");      if (hMutex)      {          if (ERROR_ALREADY_EXISTS==GetLastError())//得到錯誤:已經存在   
        {          // 如果已有互斥量存在則釋放控制代碼並複位互斥量           CloseHandle(m_hMutex);          m_hMutex = NULL;              cout<<"only one instance can run!"<<endl;              return;          }      }      WaitForSingleObject(hMutex,INFINITE);      ReleaseMutex(hMutex);                Sleep(4000);//讓主線程睡4秒,讓其他線程有時間執行完他們的代碼,如果不睡就會出現其他線程執行不完或出錯的情況,但時如果不知道線程需要多少時間執行,那應該寫多少時間?   }  //線程1的入口函數   DWORD WINAPI Fun1Proc(LPVOID lpParameter)//thread data   {      while (true)//無限迴圈線程       {          WaitForSingleObject(hMutex,INFINITE);//得到互斥體才能執行           if (tickets>0)          {              Sleep(1);              cout<<"thread1 sell ticket :"<<tickets--<<endl;          }          else              break;          ReleaseMutex(hMutex);//釋放互斥體      }        return 0;  }  //線程2的入口函數   DWORD WINAPI Fun2Proc(LPVOID lpParameter)//thread data   {      while (true)      {          WaitForSingleObject(hMutex,INFINITE);          if (tickets>0)          {              Sleep(1);              cout<<"thread2 sell ticket :"<<tickets--<<endl;          }          else              break;          ReleaseMutex(hMutex);      }            return 0;  }  //詳解   HANDLE CreateMutex(   LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全屬性的指標    BOOL bInitialOwner, // 初始化互斥對象的所有者    LPCTSTR lpName // 指向互斥對象名的指標   );  參數   lpMutexAttributes   指向一個SECURITY_ATTRIBUTES結構的指標,這個結構決定互斥體控制代碼是否被子進程繼承。       bInitialOwner   布爾類型,決定互斥體的建立者是否為擁有者   lpName   指向互斥體名字字串的指標。互斥體可以有名字。   互斥體的好處是可以在進程間共用  

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.