国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Linux內(nèi)核多線(xiàn)程-各個(gè)平臺(tái)下的多線(xiàn)程

這里主要實(shí)現(xiàn)兩個(gè)線(xiàn)程間通信,當(dāng)flag = 10 之后通知另外一個(gè)線(xiàn)程(也就是“Linux內(nèi)核多線(xiàn)程(二)”中的程序的各種平臺(tái)實(shí)現(xiàn))。

首先是C++ 11 的方式:

#include <thread>#include <iostream>#include <mutex>#include <queue>#include <condition_variable>#include <atomic>using namespace std;const int M = 10;int main(){    mutex lockBuffer;          int flag = 0;    bool stop = false;    int count = 0;    condition_variable_any recv_task_cond;    condition_variable_any RecieveTask_cond;       thread recv_task([&]()    {         while(true)        {                std::this_thread::sleep_for (chrono::milliseconds (1000));                lockBuffer.lock ();                if(stop)                {                    lockBuffer.unlock();                    RecieveTask_cond.notify_one();                    break;                }                if (flag == M)                {                    cout<< "recv task try to wake up RecieveTask! "<<endl;                    count++;                    lockBuffer.unlock ();                    RecieveTask_cond.notify_one ();                                    }                else                {                    flag++;                    lockBuffer.unlock ();                }        }        cout<< "recv_task exit"<<endl;    } );    thread RecieveTask([&]()    {        while(true)            {                std::this_thread::sleep_for (chrono::milliseconds (15));                   cout<<"In Recieve Task !" <<endl;                lockBuffer.lock ();                if(flag != M)                {                    RecieveTask_cond.wait(lockBuffer);                }                if(stop)                {                    lockBuffer.unlock();                    recv_task_cond.notify_one();                    break;                }                cout<<"WAKE UP  "<< count <<" times \t"<<" FLAG = " << flag <<endl;                cout<<endl;                flag = 0;                                lockBuffer.unlock ();                recv_task_cond.notify_one ();            }        cout<< "Recieve Task exit "<<endl;    } );    cout<< "Press Enter to stop "<<endl;    getchar();    stop = true;    recv_task.join();    RecieveTask.join();    cout<<"Main Thread"<<endl;    return 0;}

運(yùn)行結(jié)果:

 

下面是使用windows提過(guò)的API來(lái)實(shí)現(xiàn)的方式:

#include <stdio.h>#include <conio.h>#include <process.h>#include <windows.h>HANDLE  g_hThreadEvent,g_hevent;int flag = 0;CRITICAL_SECTION g_Critical;unsigned int __stdcall recv_task(void *pPM){        printf("%s 啟動(dòng)\n", (PSTR)pPM);    while(1)    {        Sleep(1000);        EnterCriticalSection(&g_Critical);        printf("flag = %d\n", flag++);        if(flag == 10)            SetEvent(g_hThreadEvent);        LeaveCriticalSection(&g_Critical);    }    return 0;}unsigned int __stdcall RecieveTask(void *pPM){    printf("%s 啟動(dòng)\n", (PSTR)pPM);    while(1)    {        WaitForSingleObject(g_hThreadEvent, INFINITE);        EnterCriticalSection(&g_Critical);        Sleep(5000);        printf("wake up flag = %d\n", flag);        ResetEvent(g_hThreadEvent);        flag = 0;        LeaveCriticalSection(&g_Critical);    }    return 0;}int main(){    InitializeCriticalSection(&g_Critical);        g_hThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);    g_hevent = CreateEvent(NULL,FALSE,FALSE,NULL);    HANDLE h[2];    SetEvent(g_hevent);    h[0] = (HANDLE)_beginthreadex(NULL, 0, recv_task, "recv_task", 0, NULL);        h[1] = (HANDLE)_beginthreadex(NULL, 0, RecieveTask, "RecieveTask", 0, NULL);    WaitForMultipleObjects(2,h,TRUE,INFINITE);        CloseHandle(g_hThreadEvent);    return 0;}

運(yùn)行結(jié)果:

 

最后是使用posix 線(xiàn)程庫(kù)實(shí)現(xiàn)的方式:

#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>enum bool{FALSE = 0, TRUE = !FALSE};int stop;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥鎖*/pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化條件變量*/void *RecieveTask(void *);void *recv_task(void *);int i = 0;int main(){    pthread_t RT;    pthread_t r_t;    stop = TRUE;    pthread_create(&RT,NULL,RecieveTask,(void *)NULL);/*創(chuàng)建進(jìn)程RecieveTask*/    pthread_create(&r_t,NULL,recv_task,(void *)NULL); /*創(chuàng)建進(jìn)程recv_task*/        getchar();    stop = FALSE;    //printf("STOP\n");        pthread_join(RT, NULL);/*等待進(jìn)程recv_task結(jié)束*/        printf("BACK IN MAIN \n");    pthread_mutex_destroy(&mutex);    pthread_cond_destroy(&cond);        return 0;}void *recv_task(void *junk){    while(stop)    {        pthread_mutex_lock(&mutex);/*鎖住互斥量*//*        if(stop)        {            pthread_cond_signal(&cond);            printf("END recv_task\n");            break;        }*/        if(i == 10)            {                pthread_cond_signal(&cond);/*條件改變,發(fā)送信號(hào),通知t_b進(jìn)程*/                pthread_cond_wait(&cond,&mutex);            }            else            printf("recv_task: %d \n",i++);        pthread_mutex_unlock(&mutex);/*解鎖互斥量*/        sleep(1);    }    pthread_cond_signal(&cond);    printf("recv_task exit \n");}void *RecieveTask(void *junk){    while(stop)    {        pthread_mutex_lock(&mutex);        if(i != 10)            pthread_cond_wait(&cond,&mutex);/*等待*/        if(!stop)        {                printf("END RecieveTask \n");            break;        }        printf("wake up RecieveTask: %d \n",i);        i = 0;        pthread_cond_signal(&cond);        pthread_mutex_unlock(&mutex);        sleep(1);    }    printf("RecieveTask exit \n");}

運(yùn)行結(jié)果為:

 

本來(lái)還想寫(xiě)一個(gè)vxworks下的多線(xiàn)程實(shí)現(xiàn)方式(可以通過(guò)taskSpawn()函數(shù)來(lái)創(chuàng)建線(xiàn)程,使用MSG_Q_ID來(lái)通信),但是windriver卸載了。。。

 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
使用pthread
線(xiàn)程池epoll
linux下C實(shí)現(xiàn)多線(xiàn)程
一種同步消息隊(duì)列模型 -- C++
POSIX 線(xiàn)程詳解
linux多線(xiàn)程編程,你還在用sleep么?用pthread
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服