基於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 ...