基於pthread實現的簡單執行緒池模型

2021-10-02 16:32:14 字數 3245 閱讀 4629

基於pthread實現的簡單執行緒池模型,可實現執行緒池的建立、執行、終止、釋放等操作。其主要api如下:

// 建立執行緒池

int qtpthreadpoolcreate(struct qtpthreadpool** pool, int threadcnt);

// 執行緒池銷毀操作

int qtpthreadpooldestroy(qtpthreadpool* pool);

// 執行緒池任務排程

int qtpthreadpoolruntask(qtpthreadpool* pool, sttask* task);

// 執行緒池各工作執行緒終止

int qtpthreadpoolshutdown(qtpthreadpool* pool);

具體**如下:

// qtpthreadpool******.c

#include

#include

#include

#include

#include

// 插入鍊錶簡單操作

#define ll_add(item, list) \

do \

while (0)

// 刪除鍊錶節點簡單操作

#define ll_remove(item, list) \

do \

while(0)

// 工作執行緒實體

typedef struct stworker

stworker;

// 工作任務實體

typedef struct sttask

sttask;

// 執行緒池實體

typedef struct qtpthreadpool

qtpthreadpool;

// 執行緒執行函式

void* threadcallback(void* args)

// 執行緒中間退出

if (worker->isterminated != 0)

sttask* task = worker->stthreadpool->waitingtasks;

if (task != null)

// 取出任務節點即可釋放鎖

pthread_mutex_unlock(&worker->stthreadpool->mutex);

if (task == null) continue;

// 執行任務操作不需要占有鎖

task->taskselffunc(task);

}return null;

}// 建立執行緒池

int qtpthreadpoolcreate(struct qtpthreadpool** pool, int threadcnt)

threadpool->waitingtasks = null;

threadpool->workers = null;

pthread_mutex_init(&threadpool->mutex, null);

pthread_cond_init(&threadpool->cond, null);

int i = 0;

for (; i < threadcnt; ++i)

worker->stthreadpool = threadpool;

worker->isterminated = 0;

ll_add(worker, worker->stthreadpool->workers);

if (pthread_create(&worker->threadid, null, threadcallback, worker) != 0)

pthread_detach(worker->threadid); // 設定執行緒單元為分離態

}end:

if (i < threadcnt)

free(threadpool);

*pool = null;

return -1;

}*pool = threadpool;

return 0;

}// 執行緒池銷毀操作

int qtpthreadpooldestroy(qtpthreadpool* pool)

while (pool->waitingtasks != null)

pthread_mutex_destroy(&pool->mutex);

pthread_cond_destroy(&pool->cond);

return 0;

}// 執行緒池任務排程

int qtpthreadpoolruntask(qtpthreadpool* pool, sttask* task)

// 執行緒池各工作執行緒終止

int qtpthreadpoolshutdown(qtpthreadpool* pool)

//廣播通知執行緒池終止

pthread_cond_broadcast(&pool->cond);

pthread_mutex_unlock(&pool->mutex);

}/* qtpthreaadpool test*/

int printtaskdata(void* data)

#define max_thread_size 10

#define max_task_size 100

int main()

for (int i = 0; i < max_task_size; ++i)

// 等待一會,避免執行緒池有的執行緒還沒執行完,就終止執行緒池, main 函式返回

sleep(1);

qtpthreadpoolshutdown(pool);

if (qtpthreadpooldestroy(pool) == 0)

return 0;

}// cmakelists.txt

cmake_minimum_required(version 2.8)

project(qtpthreadpool)

set(cmake_c_flags "$ -std=c11")

set(cmake_cxx_flags "$ -std=c++11")

add_executable($ "qtpthreadpool******.c")

target_link_libraries($ -lpthread)

// github 位址

[email protected]:it-financial/qtpthreadpool******.git

基於簡單線段樹的RMQ

線段樹是擅長處理區間的,是一種類似完美二叉樹的陣列結構。完美二叉樹是所有葉子深度都相同,並且每個節點要麼是葉子節點要麼有兩個兒子的樹 樹上的每個節點都維護乙個區間。根維護都是整個區間,每個節點維護的是父親的區間二等分後的其中乙個子區間,對區間對操作可以在o logn 完成。初始化 void init...

基於tensorflow的簡單線性回歸模型

usr local bin python3 ljj 1 linear regression model import tensorflow as tf import matplotlib.pyplot as plt 訓練樣本,隨手寫的 x 11,14,22,29,32,40,44,55,59,60,...

12 簡單線性回歸的實現

這一篇部落格主要想要實現一下之前推導的簡單的線性回歸演算法。下面我們對上述過程進行封裝 import numpy as np class linearregression1 def init self 初始化 linear regression 模型 self.a none self.b none ...