亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

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

2020-01-26 15:09:11
字體:
來源:轉載
供稿:網友

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

創建線程的函數

復制代碼 代碼如下:

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
);

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

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函數)和我們自己的線程(Fun函數)是隨機地交替執行的,但是兩個線程輸出太快,使我們很難看清楚,我們可以使用函數

復制代碼 代碼如下:

VOID Sleep(
    DWORD dwMilliseconds   // sleep time
);

來暫停線程的執行,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;
}

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

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;
}

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

eg4:

加入有一個資源 int a = 3

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

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

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

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

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

復制代碼 代碼如下:

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

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

復制代碼 代碼如下:

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

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

復制代碼 代碼如下:

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

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

復制代碼 代碼如下:

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

第一個參數指定所申請的資源的句柄,第二個參數一般指定為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;
}

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品免高潮费视频| 亚洲福利在线观看| 亚洲在线免费视频| 尤物99国产成人精品视频| 欧美国产日本高清在线| 欧美理论电影在线观看| 国产精品香蕉国产| 国产欧美亚洲视频| 亚洲毛片一区二区| 亚洲午夜精品久久久久久性色| 97欧美精品一区二区三区| 国产精品第10页| 久久久黄色av| 日韩欧美a级成人黄色| 亚洲午夜av久久乱码| 亚洲精品福利在线观看| 成人情趣片在线观看免费| 国产精品久久久久久久久久久久久久| 国产一区深夜福利| 国外色69视频在线观看| 色视频www在线播放国产成人| 亚洲午夜国产成人av电影男同| 日韩视频在线一区| 精品国产一区二区三区久久久| 日韩有码片在线观看| 色综合色综合久久综合频道88| 97超碰国产精品女人人人爽| 亚洲网站视频福利| 亚洲国产97在线精品一区| 日韩精品www| 国产97免费视| 91av在线看| 伊人久久久久久久久久久久久| 欧美成人免费一级人片100| 国产成人综合一区二区三区| 中国人与牲禽动交精品| 久久久久久久久久久成人| 精品亚洲一区二区| 国产精品主播视频| 一区二区三欧美| 国产福利视频一区| 欧美最猛性xxxxx(亚洲精品)| 亚洲午夜女主播在线直播| 91久久嫩草影院一区二区| 色综合伊人色综合网| 91精品中文在线| 国产精品免费在线免费| 国产成人综合亚洲| 亚洲精品乱码久久久久久按摩观| 国内精品久久影院| 日韩中文在线观看| 欧美日韩亚洲高清| 亚洲四色影视在线观看| 国产精品第一视频| 久久好看免费视频| 国产精品v片在线观看不卡| 日韩成人在线播放| 国产精品偷伦视频免费观看国产| 欧美猛男性生活免费| 久久久999精品视频| 一本色道久久88综合日韩精品| 久久婷婷国产麻豆91天堂| 久久夜精品va视频免费观看| 亚洲国产毛片完整版| 午夜精品久久17c| 国产精品一区二区3区| 精品亚洲一区二区三区在线观看| 成人黄色av免费在线观看| 国产91久久婷婷一区二区| 在线观看视频亚洲| 亚洲一区二区三区四区视频| 91精品啪在线观看麻豆免费| 97av在线影院| 国产成人久久精品| 日韩经典中文字幕在线观看| www.国产精品一二区| 午夜精品在线视频| 久久91超碰青草是什么| 九九精品在线观看| 国外成人性视频| 国产精品亚洲网站| 精品久久香蕉国产线看观看gif| 国产精品精品视频一区二区三区| 亚洲欧美在线免费观看| 国模精品一区二区三区色天香| 亚洲欧美在线磁力| 国产亚洲人成网站在线观看| 欧美肥臀大乳一区二区免费视频| 91视频九色网站| 在线精品高清中文字幕| 91在线观看免费高清完整版在线观看| 97视频在线观看网址| 欧美精品成人在线| 亚洲高清在线观看| 国产精品一区二区久久久| 高跟丝袜欧美一区| 日韩中文字幕在线免费观看| 成人在线精品视频| 国产精品高精视频免费| 亚州成人av在线| 亚洲综合精品伊人久久| 亚洲专区中文字幕| 精品久久久中文| 欧洲中文字幕国产精品| 国产成人精彩在线视频九色| 国产精品久久久久久久久久东京| 亚洲美女视频网站| 欧美成人一区二区三区电影| 欧美午夜电影在线| 国产日韩欧美一二三区| 亚洲人成电影在线观看天堂色| 久久亚洲综合国产精品99麻豆精品福利| 欧美日韩免费在线| 欧美日韩国产中文精品字幕自在自线| 一区二区三区视频免费在线观看| 国产网站欧美日韩免费精品在线观看| 国产91在线高潮白浆在线观看| 国产欧美久久一区二区| 亚洲精品一区二区网址| 国产97人人超碰caoprom| 久久久久www| 97精品视频在线观看| 亚洲国产日韩欧美在线图片| 国产精品久久久久9999| 欧美裸体xxxx极品少妇| 亚洲人成电影网站色| 国产精品高清在线| 国产成人精品在线| 精品国产乱码久久久久久婷婷| 欧美激情一区二区三区在线视频观看| 成人免费视频97| 日本久久久久久久久| 91精品国产网站| 久久人人爽人人| 精品久久在线播放| 最好看的2019年中文视频| 久久精品国产欧美亚洲人人爽| 欧美日韩国产精品一区二区三区四区| 成人a视频在线观看| 久久久久久久香蕉网| 美女扒开尿口让男人操亚洲视频网站| 亚洲欧洲国产伦综合| 亚洲高清av在线| 亚洲精品国产电影| 色噜噜亚洲精品中文字幕| 欧美国产日产韩国视频| 成人在线视频网| 国产精品专区一| 亚洲国产精品va在线观看黑人| 久久久午夜视频| 蜜臀久久99精品久久久无需会员| 国产亚洲欧美日韩一区二区| 日韩中文字幕免费视频| 亚洲成人网在线| 日韩国产在线看| 亚洲精品wwww| 精品一区精品二区| 亚洲天堂第一页| 亚洲精品一二区| 国产日韩欧美一二三区| 亚洲国产精品系列| 亚洲精品影视在线观看| 久久久久久国产三级电影| 日韩电视剧免费观看网站|