linux C 執行緒池 獨佔共享鎖實現

2021-06-16 16:38:16 字數 1731 閱讀 5143

如果乙個應用需要頻繁的建立和銷毀執行緒,而任務執行的時間又非常短,這樣執行緒建立和銷毀的帶來的開銷就不容忽視,這時也是執行緒池該出場的機會了。如果執行緒建立和銷毀時間相比任務執行時間可以忽略不計,則沒有必要使用執行緒池了,本文使用共享獨佔模式實現執行緒池中任務同步與互斥。使用場景主要用於寫入任務較少,執行任務較多的場景。

/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加任...