如果乙個應用需要頻繁的建立和銷毀執行緒,而任務執行的時間又非常短,這樣執行緒建立和銷毀的帶來的開銷就不容忽視,這時也是執行緒池該出場的機會了。如果執行緒建立和銷毀時間相比任務執行時間可以忽略不計,則沒有必要使用執行緒池了,本文使用共享獨佔模式實現執行緒池中任務同步與互斥。使用場景主要用於寫入任務較少,執行任務較多的場景。
/multithreadtest.c
#include "multithreadtest.h"
typedef struct threadworker
;typedef struct threadpool
;static struct threadpool *pool=null;
static void *threadrun(void *arg);
void poolinit(int maxthreadnum)
}int pooladdtask(void *(*taskrun)(void *arg),void *arg)
member->next=newtask;
}else
if(pool->queuehead!=null)
pthread_rwlock_unlock(&(pool->rwlock));
return 0;
}static void *threadrun(void *arg)
pthread_rwlock_unlock(&(pool->rwlock));
if(curworker==null&&shutdown!=0)//任務鍊錶為空且收到銷毀線池命令時終止執行緒
if(curworker!=null)
}pthread_exit(0);
}int pooldestroy()
pthread_rwlock_wrlock(&(pool->rwlock));
pool->shutdown=1;
pthread_rwlock_unlock(&(pool->rwlock));
int i;
for(i=0;imaxthreadnum;i++)
free(pool->threadid);
struct threadworker *deleteheader=null;
while(pool->queuehead!=null)
pthread_rwlock_destroy(&(pool->rwlock));
free(pool);
return 0;}/
multithreadtest.h
#include
#include
#include
#include
#include
#include
void poolinit(int maxthreadnum);
int pooladdtask(void *(*taskrun)(void *arg),void *arg);
int pooldestroy();
/test.c
#include "multithreadtest.h"
void *myfunc(void *arg);
int main(void)
pooldestroy();
free(num);
exit(0);
}void *myfunc(void *arg)
/編譯引數: gcc -o test multithreadtest.* test.c -lrt -lpthread
Java 獨佔鎖 共享鎖
獨享鎖和共享鎖在你去讀c.u.t包下的reereentrantlock和reentrantreadwritelock你就會發現,它倆乙個是獨享乙個是共享鎖。獨享鎖 該鎖每一次只能被乙個執行緒所持有。共享鎖 該鎖可被多個執行緒共有,典型的就是reentrantreadwritelock裡的讀鎖,它的讀...
Java 獨佔鎖 共享鎖
獨享鎖和共享鎖在你去讀c.u.t包下的reereentrantlock和reentrantreadwritelock你就會發現,它倆乙個是獨享乙個是共享鎖。獨享鎖 該鎖每一次只能被乙個執行緒所持有。共享鎖 該鎖可被多個執行緒共有,典型的就是reentrantreadwritelock裡的讀鎖,它的讀...
獨佔鎖與共享鎖
原始碼分析 獨佔鎖和共享鎖同樣是一種概念。我們先介紹一下具體的概念,然後通過 reentrantlock 和 reentrantreadwritelock 的原始碼來介紹獨佔鎖和共享鎖。獨佔鎖也叫排他鎖,是指該鎖一次只能被乙個執行緒所持有。如果執行緒t對資料a加上排他鎖後,則其他執行緒 能再對a加任...