最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++多線程編程簡單實例

 更新時間:2015年03月17日 10:44:34   投稿:hebedich  
本文給大家分享的是C++多線程編程簡單實例,由于C++本身沒有多線程機制,在windows下我們使用調用SDK win32 api來實現(xiàn),示例都很簡單,講解的也很詳細,推薦給大家。

C++本身并沒有提供任何多線程機制,但是在windows下,我們可以調用SDK win32 api來編寫多線程的程序,下面就此簡單的講一下:

創(chuàng)建線程的函數(shù)

復制代碼 代碼如下:

HANDLE CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
    SIZE_T dwStackSize,                       // initial stack size
    LPTHREAD_START_ROUTINE lpStartAddress,    // thread function
    LPVOID lpParameter,                       // thread argument
    DWORD dwCreationFlags,                    // creation option
    LPDWORD lpThreadId                        // thread identifier
);

在這里我們只用到了第三個和第四個參數(shù),第三個參數(shù)傳遞了一個函數(shù)的地址,也是我們要指定的新的線程,第四個參數(shù)是傳給新線程的參數(shù)指針。

eg1:

復制代碼 代碼如下:

#include <iostream>
#include <windows.h>
using namespace std;
DWORD WINAPI Fun(LPVOID lpParamter)
{
      while(1) { cout<<"Fun display!"<<endl; }
}
int main()
{
    HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);
    CloseHandle(hThread);
    while(1) { cout<<"main display!"<<endl;  }
    return 0;
}

我們可以看到主線程(main函數(shù))和我們自己的線程(Fun函數(shù))是隨機地交替執(zhí)行的,但是兩個線程輸出太快,使我們很難看清楚,我們可以使用函數(shù)

復制代碼 代碼如下:

VOID Sleep(
    DWORD dwMilliseconds   // sleep time
);

來暫停線程的執(zhí)行,dwMilliseconds表示千分之一秒,所以

Sleep(1000);

表示暫停1秒

eg2:

復制代碼 代碼如下:

#include <iostream>
#include <windows.h>
using namespace std;
DWORD WINAPI Fun(LPVOID lpParamter)
{   
      while(1) { cout<<"Fun display!"<<endl; Sleep(1000);}
}
int main()
{
      HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);
      CloseHandle(hThread);
      while(1) { cout<<"main display!"<<endl;  Sleep(2000);}
      return 0;
}

執(zhí)行上述代碼,這次我們可以清楚地看到在屏幕上交錯地輸出Fun display!和main display!,我們發(fā)現(xiàn)這兩個函數(shù)確實是并發(fā)運行的,細心的讀者可能會發(fā)現(xiàn)我們的程序是每當Fun函數(shù)和main函數(shù)輸出內容后就會輸出換行,但是我們看到的確是有的時候程序輸出換行了,有的時候確沒有輸出換行,甚至有的時候是輸出兩個換行。這是怎么回事?下面我們把程序改一下看看:

eg3:

復制代碼 代碼如下:

#include <iostream>
#include <windows.h>
using namespace std;
DWORD WINAPI Fun(LPVOID lpParamter)
{
      while(1) { cout<<"Fun display!\n"; Sleep(1000);}
}
int main()
{
      HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);
      CloseHandle(hThread);
      while(1) { cout<<"main display!\n";  Sleep(2000);}
      return 0;
}

我們再次運行這個程序,我們發(fā)現(xiàn)這時候正如我們預期的,正確地輸出了我們想要輸出的內容并且格式也是正確的。下面我就來講一下此前我們的程序為什么沒有正確的運行。多線程的程序時并發(fā)地運行的,多個線程之間如果公用了一些資源的話,我們并不能保證這些資源都能正確地被利用,因為這個時候資源并不是獨占的,舉個例子吧:

eg4:

加入有一個資源 int a = 3

有一個線程函數(shù) selfAdd() 該函數(shù)是使 a += a;

又有一個線程函數(shù) selfSub() 該函數(shù)是使a -= a;

我們假設上面兩個線程正在并發(fā)欲行,如果selfAdd在執(zhí)行的時候,我們的目的是想讓a編程6,但此時selfSub得到了運行的機會,所以a變成了0,等到selfAdd的到執(zhí)行的機會后,a += a ,但是此時a確是0,并沒有如我們所預期的那樣的到6,我們回到前面EG2,在這里,我們可以把屏幕看成是一個資源,這個資源被兩個線程所共用,加入當Fun函數(shù)輸出了Fun display!后,將要輸出endl(也就是清空緩沖區(qū)并換行,在這里我們可以不用理解什么事緩沖區(qū)),但此時main函數(shù)確得到了運行的機會,此時Fun函數(shù)還沒有來得及輸出換行就把CPU讓給了main函數(shù),而這時main函數(shù)就直接在Fun display!后輸出main display!,至于為什么有的時候程序會連續(xù)輸出兩個換行,讀者可以采用同樣的分析方法來分析,在這里我就不多講了,留給讀者自己思考了。

那么為什么我們把eg2改成eg3就可以正確的運行呢?原因在于,多個線程雖然是并發(fā)運行的,但是有一些操作是必須一氣呵成的,不允許打斷的,所以我們看到eg2和eg3的運行結果是不一樣的。

那么,是不是eg2的代碼我們就不可以讓它正確的運行呢?答案當然是否,下面我就來講一下怎樣才能讓eg2的代碼可以正確運行。這涉及到多線程的同步問題。對于一個資源被多個線程共用會導致程序的混亂,我們的解決方法是只允許一個線程擁有對共享資源的獨占,這樣就能夠解決上面的問題了。

復制代碼 代碼如下:

HANDLE CreateMutex(
    LPSECURITY_ATTRIBUTES lpMutexAttributes,  // SD
    BOOL bInitialOwner,                       // initial owner
    LPCTSTR lpName                            // object name
 );

該函數(shù)用于創(chuàng)造一個獨占資源,第一個參數(shù)我們沒有使用,可以設為NULL,第二個參數(shù)指定該資源初始是否歸屬創(chuàng)建它的進程,第三個參數(shù)指定資源的名稱。

復制代碼 代碼如下:

HANDLE hMutex = CreateMutex(NULL,TRUE,"screen");

這條語句創(chuàng)造了一個名為screen并且歸屬于創(chuàng)建它的進程的資源

復制代碼 代碼如下:

BOOL ReleaseMutex(
    HANDLE hMutex   // handle to mutex
  );

該函數(shù)用于釋放一個獨占資源,進程一旦釋放該資源,該資源就不再屬于它了,如果還要用到,需要重新申請得到該資源。申請資源的函數(shù)如下

復制代碼 代碼如下:

DWORD WaitForSingleObject(
    HANDLE hHandle,        // handle to object
    DWORD dwMilliseconds   // time-out interval
  );

第一個參數(shù)指定所申請的資源的句柄,第二個參數(shù)一般指定為INFINITE,表示如果沒有申請到資源就一直等待該資源,如果指定為0,表示一旦得不到資源就返回,也可以具體地指定等待多久才返回,單位是千分之一秒。好了,該到我們來解決eg2的問題的時候了,我們可以把eg2做一些修改,如下

eg5:

復制代碼 代碼如下:

#include <iostream>
#include <windows.h>
using namespace std;
HANDLE hMutex;
DWORD WINAPI Fun(LPVOID lpParamter)
{
       while(1) {
                 WaitForSingleObject(hMutex, INFINITE);
                 cout<<"Fun display!"<<endl;
                 Sleep(1000);
                 ReleaseMutex(hMutex);
        }
  }
int main()
{
      HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);
      hMutex = CreateMutex(NULL, FALSE, "screen");
      CloseHandle(hThread);
      while(1) {
               WaitForSingleObject(hMutex, INFINITE);
               cout<<"main display!"<<endl; 
               Sleep(2000);
               ReleaseMutex(hMutex);
      }
      return 0;
}

運行代碼正如我們所預期的輸出的內容。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

相關文章

  • C語言鏈表實現(xiàn)商品庫存管理系統(tǒng)

    C語言鏈表實現(xiàn)商品庫存管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言鏈表實現(xiàn)商品庫存管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++中的編譯與鏈接

    C++中的編譯與鏈接

    這篇文章主要介紹了C++中的編譯與鏈接,編譯型語言SHI?c++最大的優(yōu)點,相比于Python這種解釋型語言,C++在編譯階段就進行了許多處理,在執(zhí)行階段便具有高效性,下面我們就來詳細講解該內容吧
    2021-12-12
  • Visual Studio 2022卡死分析

    Visual Studio 2022卡死分析

    本文主要介紹了Visual Studio 2022卡死分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • VC動態(tài)生成菜單項的實現(xiàn)方法

    VC動態(tài)生成菜單項的實現(xiàn)方法

    這篇文章主要介紹了VC動態(tài)生成菜單項的實現(xiàn)方法,在桌面應用程序開發(fā)中常會用到的一個功能,需要的朋友可以參考下
    2014-08-08
  • C++抽象基類講解

    C++抽象基類講解

    這篇文章主要介紹了C++抽象基類講解,象基類abstract base class簡稱ABC,C++實現(xiàn)繼承的時候,需要保證派生類和基類之間是一種is-a的關系。在大多數(shù)時刻,這樣的關系是沒有問題的,然而在一些特殊的情況可能會遇到問題,下面來看看文章的具體介紹吧
    2022-01-01
  • 深入探究C++編程中的資源泄漏問題以及排查方法

    深入探究C++編程中的資源泄漏問題以及排查方法

    在C++程序開發(fā)維護過程中,時常會遇到資源泄漏問題,比如GDI對象泄漏、進程線程句柄泄漏以及內存泄漏問題,今天我們就來深入探討一下這幾類資源泄漏以及排查這些泄露的辦法,需要的朋友可以參考下
    2023-10-10
  • C++關鍵字thread_local學習筆記

    C++關鍵字thread_local學習筆記

    這篇文章主要為大家介紹了C++關鍵字thread_local學習筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 怎么實現(xiàn)類的成員函數(shù)作為回調函數(shù)

    怎么實現(xiàn)類的成員函數(shù)作為回調函數(shù)

    不使用成員函數(shù),為了訪問類的成員變量,可以使用友元操作符(friend),在C++中將該函數(shù)說明為類的友元即可
    2013-10-10
  • C++學習之智能指針中的unique_ptr與shared_ptr

    C++學習之智能指針中的unique_ptr與shared_ptr

    吃獨食的unique_ptr與樂于分享的shared_ptr是C++中常見的兩個智能指針,本文主要為大家介紹了這兩個指針的使用以及智能指針使用的原因,希望對大家有所幫助
    2023-05-05
  • c++從函數(shù)返回數(shù)組的方法代碼

    c++從函數(shù)返回數(shù)組的方法代碼

    在本篇文章里小編給大家整理的是關于c++從函數(shù)返回數(shù)組的方法代碼,有興趣的朋友們可以學習參考下。
    2020-02-02

最新評論

长沙县| 万年县| 罗江县| 通榆县| 玛多县| 信阳市| 容城县| 蒙阴县| 苗栗市| 闽侯县| 盐津县| 安国市| 浠水县| 洛浦县| 鸡东县| 兖州市| 临城县| 虹口区| 桓台县| 扶沟县| 全州县| 嘉峪关市| 东台市| 舞阳县| 普定县| 木里| 沧源| 津南区| 辽宁省| 兴化市| 揭东县| 梧州市| 三门峡市| 郁南县| 西林县| 柘城县| 当阳市| 松阳县| 阿巴嘎旗| 长海县| 柞水县|