1. 程式人生 > >一個跨WINDOWS LINUX平臺的執行緒類

一個跨WINDOWS LINUX平臺的執行緒類

繼Windows下實現一個CThread封裝類之後,這裡我再實現一個跨WINDOWS LINUX平臺的執行緒類

標頭檔案 DXThread.h

#ifndef __DXTHREAD_H__
#define __DXTHREAD_H__

#define DX_WINDOWS //在WINDOWS上就開啟它
//#define DX_LINUX //在LINUX 上就開啟它

#ifdef DX_WINDOWS
#include <windows.h>
#define DX_CALLBACK WINAPI
typedef HANDLE DXHANDLE;
#endif

#ifdef DX_LINUX
#include <pthread.h>
#define DX_CALLBACK
typedef pthread_t DXHANDLE;
#endif

class CDXThread
{
public:
    CDXThread();
    virtual ~CDXThread();
    virtual int Run();
    bool Start();
    bool Join();
    bool Detach();
    
private:
    static void* DX_CALLBACK RunThread(void* pParam);
    DXHANDLE m_hThread;
    void* m_pParam;
    unsigned long m_nRet;
protected:
    bool m_bStart;
    int m_nState;
};

#endif //DXThread.h 

//原始檔  DXThread.cpp
#include "DXThread.h"

CDXThread::CDXThread()  
{  
    m_hThread = NULL;  
    m_pParam = NULL;  
    m_nRet = 0;  
    m_bStart = false;
    m_nState = 0;
}  

CDXThread::~CDXThread()  
{
    if (m_bStart && (m_nState == 0))
    {
        Join();
    }
}  

int CDXThread::Run()  
{  
    return 0;  
}  

bool CDXThread::Start()  
{
    if (true == m_bStart)
        return true;

    bool bOK = true;
    m_bStart = true;
#ifdef DX_WINDOWS
    if (NULL == 
            (
             m_hThread = CreateThread(NULL, 0, 
                 (unsigned long(DX_CALLBACK*)(void*))&RunThread, this, 0, NULL)
             )
        )
    {
        bOK = false;
    }
#endif

#ifdef DX_LINUX
    if (0 != pthread_create(&m_hThread, NULL, RunThread, this))
    {
        bOK = false;
    }
#endif

    if (!bOK)
    {
        m_bStart = false;
        return false;
    }
    
    return true;  
}  

bool CDXThread::Join()  
{  
    if (!m_bStart)
        return false;

    if (m_nState == 1)
        return false;

    bool ret;
    m_bStart = false;

#ifdef DX_WINDOWS
    
    while (1)
    {
        if (FALSE == GetExitCodeThread(m_hThread, &m_nRet))  
        {
            ret = false;
            break;
        }
        else  
        {
            if (m_nRet == STILL_ACTIVE)
            {
                Sleep(100);
                continue;
            }
            CloseHandle(m_hThread);
            ret = true;
            break;
        }
    }

#endif

#ifdef DX_LINUX
    ret = (0 == pthread_join(m_hThread, (void **)&m_nRet));
#endif

    m_hThread = NULL;
    return ret;
}  

bool CDXThread::Detach()
{
    if (!m_bStart)
        return false;

    if (m_nState == 1)
        return false;

    m_nState = 1;
#ifdef DX_WINDOWS
    return (TRUE == CloseHandle(m_hThread));
#endif
    
#ifdef DX_LINUX
    return (0 == pthread_detach(m_hThread));
#endif

}

void* DX_CALLBACK CDXThread::RunThread(void* pParam)  
{  
    CDXThread* pThis = (CDXThread*)pParam;  
    int nRet = pThis->Run();  
    return (void *)nRet;
}

//呼叫例項
#include <stdio.h>
#include "DXThread.h"

class CTest : public CDXThread
{
    public:
        int Run()
        {
            printf("1..\n");
            return 0;
        }
};

int main(int argc, char* argv[])
{
    CTest a;
    a.Start();
    
    //a.Detach(); //分離執行緒
    
    if (false == a.Join())
    {
        printf("join failed!\n");
    }
    
    return 0;
}



相關推薦

一個WINDOWS LINUX平臺執行

繼Windows下實現一個CThread封裝類之後,這裡我再實現一個跨WINDOWS LINUX平臺的執行緒類 標頭檔案 DXThread.h #ifndef __DXTHREAD_H__ #define __DXTHREAD_H__ #define DX_WINDOW

c++ 網路程式設計(九)TCP/IP LINUX/windows下 多執行超詳細教程 以及 多執行實現服務端

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <process.h> #include <winsock2.h> #include <win

c++ 網路程式設計(九)TCP/IP LINUX/windows下 多執行超詳細教程 以及 多執行實現服務端

原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/9661012.html  先講Linux下(windows下在後面可以直接跳到後面看): 一.執行緒基本概念 前面我們講過多程序伺服器,但我們知道它開銷很大

從零開始構建一個Reactor模式的網路庫(二)執行Thread

執行緒類Thread是對POSIX執行緒的封裝類,因為要構建的是一個Linux環境下的多執行緒網路庫,對執行緒的封裝是很必要的。 首先是CurrentThread名稱空間,主要是獲取以及快取執行緒id: 1 #ifndef CURRENTTHREAD_H 2 #define CURRENTTHR

一個封裝好的執行

原文出處 class CThread { public: /**//** * Default Constructor */ CThread() {

Linux執行學習(5)--C++實現一個執行

多執行緒學習總結(1):https://blog.csdn.net/hansionz/article/details/84665815 多執行緒學習總結(2):https://blog.csdn.net/hansionz/article/details/84675536 多執行緒學習總結

linux C++ 面向物件執行封裝

1.封裝遇到的問題 將pthread執行緒封裝為抽象類,這樣使用者在使用執行緒時,只需要繼承一下這個抽象類,並實現相應的介面就可以了。這樣做的好處是使用者可以將注意力集中線上程所要執行的邏輯上,而不需要關注建立執行緒、銷燬執行緒等細節問題上。 我們抽象類的名稱為Th

Linux執行程式設計時如何檢視一個程序中的某個執行是否存活

pthread_kill: 別被名字嚇到,pthread_kill可不是kill,而是向執行緒傳送signal。還記得signal嗎,大部分signal的預設動作是終止程序的執行,所以,我們才要用signal()去抓訊號並加上處理函式。 int pthread_kil

qq群裡分享的一個不錯的curl多執行處理抓取網頁資訊

<?php // +---------------------------------------------------------------------- // | Leaps Framework [ WE CAN DO IT JUST THINK IT ] /

windows程式設計 使用C++實現多執行

本文簡單介紹如何在windows程式設計中實現多執行緒類,供大家學習參考,也希望大家指正。 有時候我們想在一個類中實現多執行緒,主執行緒在某些時刻獲得資料,可以“通知”子執行緒去處理,然後把結果返回。下面的例項是主執行緒每隔2s產生10個隨機數,將這10隨機數傳給多執行緒

使用monkey測試時,一個控制WiFi狀態的多執行

2018年09月26日更新:新增WiFi測試APP下載地址 傳送門 -----------------------------------分割線------------------------------------ 本人在使用monkey進行手機APP效能測試的時候,

分享一個事務處理執行

 Windows下建立執行緒是很簡單的,具體建立執行緒的程式碼可以用AfxBeginThread(),也可以用CreateThread(),也可以用_beginthreadex()。大家寫的恐怕手都磨出老繭了。 但是,有時候我們經常會遇到一種情況,比如說每隔一會我就要做一些

CUDA在Windows/Linux平臺的配置及編譯

text ref gpu加速 spa ron linux平臺 opencv3 v3.4 c++ 前段時間,在TX2上裝了OpenCV3.4,TX2更新源失敗的問題,OpenCV內部很多函數都已經實現了GPU加速,但是我們手動寫的函數,想要通過GPU加速就需要手動調用CU

Windows Internals 筆記——執行優先順序

1.每個執行緒都被賦予0(最低)~31(最高)的優先順序數。當系統確定給哪個執行緒分配CPU時,它會首先檢視優先順序為31的執行緒,並以迴圈的方式進行排程。如果有優先順序為31的執行緒可供排程,那麼系統就會將CPU分配給該執行緒。在該執行緒的時間片結束時,系統檢視是否還存在另一個優先順序為31的執行緒可以執行

Linux — POSIX 執行基礎

執行緒對於Linux後臺程式設計師來說並不陌生,執行緒帶給我們併發能力的提升,也提高了軟體開發和問題定位的難度,本文 嘗試結合GlibC 程式碼, 對POSIX的執行緒做一個簡單說明,重點介紹執行緒的建立,釋放和連線上需要注意的問題。 多程序和多執行緒的都只有一個目的,並行處理,提高CP

Linux執行程式設計---執行間同步(互斥鎖、條件變數、訊號量和讀寫鎖)

本篇博文轉自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。  下面是思維導

Windows程式設計之執行同步

Windows程式設計中執行緒同步的主要機制:互斥、事件、訊號量、可等待定時器,不說了,直接上程式碼: // ThreadSync.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <windows.h>

LINUX執行 JNI 回撥 java static

1.Linux 開啟執行緒 //渲染執行緒Rendering void* thread_rendering_process(void *lParam) {     unsigned int local_wr;     int index; &

linux執行之訊號量 sem_init

1. 什麼是訊號量 linux sem 訊號量是一種特殊的變數,訪問具有原子性, 用於解決程序或執行緒間共享資源引發的同步問題。 使用者態程序對 sem 訊號量可以有以下兩種操作: 等待訊號量 當訊號量值為 0 時,程式等待;當訊號量值大於 0 時,訊號量減 1,程式

Linux執行學習總結

原文:https://www.cnblogs.com/luoxn28/p/6087649.html Linux多執行緒學習總結   執行緒是程式中完成一個獨立任務的完整執行序列,即一個可排程的實體;程序相當於執行中程式的一種抽象。根據執行環境的排程者的身份,執行緒可分為核心執行緒和使用者執行