ccriticalsection對應c語言_basic語言與c語言_c語言與b語言

飛來科技  發布時間:2019-08-16 10:07:20

本文關鍵詞:ccriticalsection對應c語言

basic語言與c語言_ccriticalsection對應c語言_c語言與b語言

線程索引:

#include <pthread.h>;

int pthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*start_routine)(void *),void *arg);

void pthread_exit(void *retval);

int pthread_join(pthread *thread,void **thread_return);

pthread_create 創建一個線程,thread 是用于顯示創建線程的ID,

attr 指出線程創建時候的特性,我們用NULL 來顯示使用缺省屬性.

start_routine 函數指針是線程創建成功后直到執行的鏈表,arg是這個鏈表的惟一一個參數.表明傳遞給start_routine 的取值.

pthread_exit 函數和exit 函數類似用于退出線程.這個鏈表結束線程,釋放鏈表的資源,并在最終堵塞,

直到這些線程使用pthread_join 函數等待它.然后將*retval 的值傳遞給**thread_return.

由于這個鏈表釋放所有的鏈表資源,所以retval 不希望指向下標的局部方差.

pthread_join 和wait 調用一樣用來等待指定的線程.

linux C線程間同步機制有很多:

互斥鎖基本操作鏈表:

初始化互斥鎖:pthread_mutex_init();

銷毀互斥鎖:pthread_mutex_destroy();

阻塞申請互斥鎖:pthread_mutex_lock();

釋放互斥鎖:pthread_mutex_unlock();

非阻塞申請互斥鎖:pthread_mutex_trylock();

條件變量基本函數:

初始化條件取值:pthread_cond_init();

阻塞等待條件取值:pthread_cond_wait();

通知等待該條件取值的第一個線程:pthread_cond_signal();

在指定的時間之內阻塞等待條件取值:pthread_cond_timedwait();

通知等待該條件取值的一切線程:pthread_cond_broadcast();

銷毀條件取值:pthread_cond_destory();

讀寫鎖基本操作:

初始化讀寫鎖:pthread_rwlock_init();

阻塞申請讀鎖:pthread_rwlock_rdlock();

非阻塞申請讀鎖:pthread_rwlock_tryrdlock();

阻塞申請寫鎖:pthread_rwlock_wrlock();

非阻塞申請寫鎖:pthread_rwlock_trywrlock();

釋放鎖:pthread_rwlock_unlock();

銷毀鎖:pthread_rwlock_destroy();

無名信號量基本操作:(值為1時可以也是互斥量)

初始化信號量:sem_init(sem_t*sem,int pshared,unsigned int value);

銷毀信號量:sem_destroy(sem_t*sem);

釋放信號量(+1):sem_post(sem_t*sem);

阻塞等待信號量(-1):sem_wait(sem_t*sem);

非阻塞等待信號量:sem_trywait(sem_t*sem);

獲取目前信號量值:sem_getvalue(sem_t*sem);

定時等待信號量:sem_timedwait(sem_t*sem,sturct timespec*abs_timeout);

一,互斥鎖mutex

1.創建互斥鎖

靜態形式: pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER

動態形式: int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);

2.注銷一個互斥鎖: int pthread_mutex_destroy(pthread_mutex_t *mutex);

互斥鎖屬性:當前(glibc2.2.3,linuxthreads0.9)有四個值可供選擇:

PTHREAD_MUTEX_TIMED_NP:這是缺省值,也就是普通鎖。當一個線程加鎖之后,其余請求鎖的線程將產生一個等待隊列,并在解鎖后按優先級獲得鎖。這種鎖策略確保了資源分配的公平性。

PTHREAD_MUTEX_RECURSIVE_NP:嵌套鎖,允許同一個線程對同一個鎖成功獲得多次,并通過多次unlock解鎖。如果是不同線程請求,則在加鎖線程解鎖時再次競爭。

PTHREAD_MUTEX_ERRORCHECK_NP:檢錯鎖,如果同一個線程請求同一個鎖,則前往EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP類型動作相似。這樣就確保當不禁止多次加鎖時不會出現最簡單現象下的死鎖。

PTHREAD_MUTEX_ADAPTIVE_NP:適應鎖,動作最簡單的鎖類型,僅等待解鎖后再次競爭。

3.鎖操作:主要涵蓋加鎖pthread_mutex_lock()、解鎖pthread_mutex_unlock()和試驗加鎖pthread_mutex_trylock()三個.

不論哪種類型的鎖,都不認為被兩個不同的線程同時得到,而必須等待解鎖。

對于普通鎖和適應鎖類型,解鎖者可以是同進程內任何線程;

而檢錯鎖則必須由加鎖者解鎖才有效,否則離開EPERM;

對于嵌套鎖,文檔和實現要求必須由加鎖者解鎖,但試驗結果顯示并沒有這種限制,這個不同目前還沒有得到表述。

在同一進程中的線程,如果加鎖后沒有解鎖,則任何這些線程都無法再獲得鎖。

二,條件變量:條件取值是借助線程間共享的大局變量進行同步的一種機制.

主要涵蓋兩個動作:一個線程等待"條件變量的條件組建"而掛起;

另一個線程使"條件組建"(給出條件組建信號)。

為了避免競爭,條件變量的應用總是和一個互斥鎖結合在一起。

1.創建互斥鎖

靜態形式:pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

動態形式:int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);

注銷一個互斥鎖:int pthread_cond_destroy(pthread_cond_t *cond);

2.等待和激活

無條件等待 :int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

計時等待:int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);

無論哪種等待方法,都必須和一個互斥鎖配合,

以避免多個線程同時請求pthread_cond_wait()(或pthread_cond_timedwait(),下同)的爭奪條件(Race Condition)。

mutex互斥鎖必須是普通鎖(PTHREAD_MUTEX_TIMED_NP)或者適應鎖(PTHREAD_MUTEX_ADAPTIVE_NP),

且在讀取pthread_cond_wait()前必須由本線程加鎖(pthread_mutex_lock()),

而在更新條件等待隊列以前,mutex保持鎖定狀態,并程掛起進入等待前解鎖。

在條件滿足進而離開pthread_cond_wait()之前,mutex將被再次加鎖,以與步入pthread_cond_wait()前的加鎖動作相應。

3.激發條件有兩種方式:

pthread_cond_signal()激活一個等待該條件的線程,存在多個等待線程時按入隊順序激活其中一個;

pthread_cond_broadcast()則激發所有等待線程。

以下圖例集中演示了互斥鎖和條件變量的結合應用,以及取消對于條件等待動作的影響。

在例證中,有兩個線程被啟動,并等待同一個條件變量,如果不使用退出回調函數(見范本中的評注部分),

則tid2將在pthread_mutex_lock()處永久等待。

如果使用回調函數,則tid2的條件等待及主線程的條件激活都能正常工作。

#include <stdio.h>

#include <pthread.h>

#include <unistd.h>

pthread_mutex_t mutex;

pthread_cond_t cond;

void * child1(void *arg)

{

pthread_cleanup_push(pthread_mutex_unlock,&mutex); /* comment 1 */

while(1){

printf("thread 1 get running \n");

printf("thread 1 pthread_mutex_lock returns %d\n",

pthread_mutex_lock(&mutex));

pthread_cond_wait(&cond,&mutex);

printf("thread 1 condition applied\n");

pthread_mutex_unlock(&mutex);

sleep(5);

}

pthread_cleanup_pop(); /* comment 2 */

}

void *child2(void *arg)

{

while(1){

sleep(3); /* comment 3 */

printf("thread 2 get running.\n");

printf("thread 2 pthread_mutex_lock returns %d\n",

pthread_mutex_lock(&mutex));

pthread_cond_wait(&cond,&mutex);

printf("thread 2 condition applied\n");

pthread_mutex_unlock(&mutex);

sleep(1);

}

}

int main(void)

{

int tid1,tid2;

printf("hello, condition variable test\n");

pthread_mutex_init(&mutex,NULL);

pthread_cond_init(&cond,NULL);

pthread_create(&tid1,NULL,child1,NULL);

pthread_create(&tid2,NULL,child2,NULL);

do{

sleep(2); /* comment 4 */

pthread_cancel(tid1); /* comment 5 */

sleep(2); /* comment 6 */

pthread_cond_signal(&cond);

}while(1);

sleep(100);

pthread_exit();

}

如果不做注釋5的pthread_cancel()動作,即使沒有那些sleep()延時操作,child1和child2都能正常工作。

注釋3和評注4的延遲導致child1有時間完成取消動作,從而使child2能在child1退出以后步入請求鎖操作。

如果沒有注釋1和注釋2的止損函數概念,系統將掛起在child2請求鎖的地方;

而所以同樣也不做注釋3和評注4的延時,child2能在child1完成取消動作以后得到控制,從而順利執行申請鎖的操作,但卻認為掛起在pthread_cond_wait()中ccriticalsection對應c語言,因為其中也是申請mutex的操作。

本文來自互聯網,由機器人自動采編,文章內容不代表本站觀點,請讀者自行辨別信息真偽,如有發現不適內容,請及時聯系站長處理。

相關閱讀
江苏快三开奖结果