<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
C語言單例模式實現執行緒池。
該程式碼中,使用了單例模式來建立執行緒池物件,保證了整個程式中只有一個執行緒池物件。
執行緒池中包含了任務佇列、工作執行緒陣列、互斥鎖、條件變數等成員,通過這些成員來實現任務的提交和執行。
在主函數中,提交了10個任務,每個任務都是一個簡單的列印數位的函數,最後等待所有任務執行完畢後銷燬執行緒池。
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #define THREAD_POOL_SIZE 5 // 任務結構體 typedef struct { void (*task)(void*); void* arg; } Task; // 執行緒池結構體 typedef struct { Task* tasks; // 任務佇列 int size; // 任務佇列大小 int head; // 任務佇列頭指標 int tail; // 任務佇列尾指標 int count; // 任務佇列中任務數量 pthread_mutex_t lock; // 互斥鎖 pthread_cond_t not_empty; // 非空條件變數 pthread_cond_t not_full; // 非滿條件變數 int shutdown; // 執行緒池是否關閉 pthread_t* threads; // 工作執行緒陣列 int thread_count; // 工作執行緒數量 } ThreadPool; // 執行緒池單例結構體 typedef struct { ThreadPool* pool; // 執行緒池指標 } ThreadPoolSingleton; static ThreadPoolSingleton* instance = NULL; // 執行緒池單例物件指標 // 工作執行緒函數 void* worker(void* arg) { ThreadPool* pool = (ThreadPool*)arg; while (1) { pthread_mutex_lock(&pool->lock); while (pool->count == 0 && !pool->shutdown) { pthread_cond_wait(&pool->not_empty, &pool->lock); } if (pool->count == 0 && pool->shutdown) { pthread_mutex_unlock(&pool->lock); pthread_exit(NULL); } Task task = pool->tasks[pool->head]; pool->head = (pool->head + 1) % pool->size; pool->count--; pthread_cond_signal(&pool->not_full); pthread_mutex_unlock(&pool->lock); task.task(task.arg); } return NULL; } // 建立執行緒池函數 ThreadPool* create_thread_pool(int thread_count, int queue_size) { ThreadPool* pool = (ThreadPool*)malloc(sizeof(ThreadPool)); pool->tasks = (Task*)malloc(sizeof(Task) * queue_size); pool->size = queue_size; pool->head = 0; pool->tail = 0; pool->count = 0; pthread_mutex_init(&pool->lock, NULL); pthread_cond_init(&pool->not_empty, NULL); pthread_cond_init(&pool->not_full, NULL); pool->shutdown = 0; pool->threads = (pthread_t*)malloc(sizeof(pthread_t) * thread_count); pool->thread_count = thread_count; for (int i = 0; i < thread_count; i++) { pthread_create(&pool->threads[i], NULL, worker, pool); } return pool; } // 銷燬執行緒池函數 void destroy_thread_pool(ThreadPool* pool) { pthread_mutex_lock(&pool->lock); pool->shutdown = 1; pthread_mutex_unlock(&pool->lock); pthread_cond_broadcast(&pool->not_empty); for (int i = 0; i < pool->thread_count; i++) { pthread_join(pool->threads[i], NULL); } free(pool->threads); free(pool->tasks); pthread_mutex_destroy(&pool->lock); pthread_cond_destroy(&pool->not_empty); pthread_cond_destroy(&pool->not_full); free(pool); } // 提交任務函數 void submit_task(ThreadPool* pool, void (*task)(void*), void* arg) { pthread_mutex_lock(&pool->lock); while (pool->count == pool->size && !pool->shutdown) { pthread_cond_wait(&pool->not_full, &pool->lock); } if (pool->shutdown) { pthread_mutex_unlock(&pool->lock); return; } pool->tasks[pool->tail].task = task; pool->tasks[pool->tail].arg = arg; pool->tail = (pool->tail + 1) % pool->size; pool->count++; pthread_cond_signal(&pool->not_empty); pthread_mutex_unlock(&pool->lock); } // 任務函數 void task_func(void* arg) { int* num = (int*)arg; printf("task %d is runningn", *num); free(num); } // 任務包裝函數 void* task_wrapper(void* arg) { TaskWrapper* wrapper = (TaskWrapper*)arg; submit_task(wrapper->pool, wrapper->task, wrapper->arg); free(wrapper); return NULL; } init_instance() { instance = (ThreadPoolSingleton*)malloc(sizeof(ThreadPoolSingleton)); instance->pool = create_thread_pool(THREAD_POOL_SIZE, THREAD_POOL_SIZE); } // 獲取執行緒池單例物件函數 ThreadPool* get_thread_pool_instance() { return instance->pool; } int main() { init_instance(); /* 程式一開始,就必須執行。不然,與懶漢式無較大差異 */ ThreadPool* pool = get_thread_pool_instance(); // 獲取執行緒池單例物件 for (int i = 0; i < 10; i++) { int* num = (int*)malloc(sizeof(int)); *num = i; TaskWrapper* wrapper = (TaskWrapper*)malloc(sizeof(TaskWrapper)); wrapper->pool = pool wrapper->task = task_func; wrapper->arg = num; pthread_t tid; pthread_create(&tid, NULL, task_wrapper, wrapper); // 提交任務 } sleep(1); // 等待所有任務執行完畢 destroy_thread_pool(pool); // 銷燬執行緒池 return 0; } /* 該範例程式碼中,使用了單例模式來建立執行緒池物件,保證了整個程式中只有一個執行緒池物件。 執行緒池中包含了任務佇列、工作執行緒陣列、互斥鎖、條件變數等成員,通過這些成員來實現任務的提交和執行。 在主函數中,提交了10個任務,每個任務都是一個簡單的列印數位的函數,最後等待所有任務執行完畢後銷燬執行緒池。 */
到此這篇關於C++單例模式實現執行緒池的範例程式碼的文章就介紹到這了,更多相關C++單例模式實現執行緒池內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45