一個跨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多執行緒學習總結 執行緒是程式中完成一個獨立任務的完整執行序列,即一個可排程的實體;程序相當於執行中程式的一種抽象。根據執行環境的排程者的身份,執行緒可分為核心執行緒和使用者執行