線程編程常見API簡介(下)

 

1、概述編程

      本節將繼續說明有關線程編程經常使用 API 的使用方法,主要說一下與線程條件變量及線程信號通知的 API。經過這些 API 能夠實現線程之間的同步及通訊機制。spa

 

2、線程條件變量 API.net

 1)初始化/銷燬線程條件變量:pthread_cond_init/pthread_cond_destroy;在 acl 庫中相應的 API 爲 acl_pthread_cond_init/acl_pthread_cond_destroy。線程

/**
 * 用線程條件變量屬性初始化線程條件變量對象
 * @param cond {pthread_cond_t*} 線程條件變量對象
 * @param attr {const pthread_condattr_t*} 條件變量屬性,用來設置線程
 *    條件變量的屬性,該參數能夠由 pthread_condattr_init/pthread_condattr_destroy 初始化和銷燬;該參數能夠設爲 NULL
 * @return {int} 返回 0 表示成功,不然出錯,錯誤號能夠用 strerror 打印
 */
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);

/**
 * 銷燬線程條件變量對象經過 pthread_cond_init 分配的資源
 * @param cond {pthread_cond_t*} 線程條件變量對象
 * @return {int} 返回 0 表示成功,不然出錯
 */
int pthread_cond_destroy(pthread_cond_t *cond);

 

 2)等待線程條件變量被其它線程通知:pthread_cond_wait/pthread_cond_timedwait,在 acl 庫中對應的 API 爲 acl_pthread_cond_wait/acl_pthread_cond_timedwait。設計

/**
 * 線程阻塞在線程條件變量直至該線程條件變量被通知,在等待狀態,該線程不會
 * 擁有線程鎖;當線程條件變量被通知時,該線程首先會對線程鎖加鎖,而後返回
 * 給調用者,即當該 API 返回時,當前線程已經擁有了其中的線程鎖
 * @param cond {pthread_cond_t*} 線程條件變量對象
 * @param mutex {pthread_mutex_t*} 與線程條件變量配合使用的線程鎖
 * @return {int} 返回 0 表示阻塞當前線程的線程條件變量被其它線程通知,同
 *   時當前線程得到相應的線程鎖;不然,表示出錯,出錯緣由通常是輸入的參數非法
 */
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t  *mutex);

/**
 * 當前線程阻塞在線程條件變量上,直到該條件變量被其它線程通知或設定的等待
 * 超時時間到達,該 API 相比 pthread_cond_wait 多出一個等待超時時間
 * @param cond {pthread_cond_t*} 線程條件變量對象
 * @param mutex {pthread_mutex_t*} 與線程條件變量配合使用的線程鎖
 * @param abstime {const struct timespec*} 超時時間截,當時間超過該
 *    時間截後,即便線程條件變量未被通知,該 API 也會返回
 * @return {int} 返回 0 表示阻塞當前線程的線程條件變量被其它線程通知,同
 *   時當前線程得到相應的線程鎖;不然,若是返回值爲 ETIMEDOUT(在 acl 庫
 *   中表示爲 ACL_ETIMEDOUT)則表示該 API 是由於超時才返回的,同時會將
 *   線程鎖加鎖,當爲其它返回值時通常是由於輸入參數非法致使
 */
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);

        上面兩個等待線程條件變量的 API中,pthread_cond_timedwait 對於設計半駐留式線程很是有用,象 acl 庫中的半駐留式線程池就用到了它。code

 

 3)通知阻塞在線程條件變量上的線程:pthread_cond_signal/pthread_cond_broadcast,在 acl 庫中相應表現形式爲:acl_pthread_cond_signal/acl_pthread_cond_broadcast。對象

/**
 * 喚醒阻塞在某個線程條件變量上的一個線程
 * @param cond {pthread_cond_t*} 線程條件變量對象
 * @return {int} 返回 0 表示成功,不然表示出錯
 */
int pthread_cond_signal(pthread_cond_t *cond);

/**
 * 喚醒阻塞在某個線程條件變量上的全部線程,當全部阻塞在線程條件變量上的
 * 全部線程被喚醒後,會首先搶佔參數中輸入的線程鎖(有多是同一個線程鎖,
 * 也有可能不是),在得到那個線程鎖後那些被喚醒的線程纔會返回
 * @param cond {pthread_cond_t*} 線程條件變量對象
 * @return {int} 返回 0 表示成功通知全部阻塞在線程條件變量上的線程,不然
 *    表示出錯
 */
int pthread_cond_broadcast(pthread_cond_t *cond);

 

3、示例blog

#include <stdio.h>
#include <assert.h>
#include <pthread.h>

/* 快速初始化線程鎖和線程條件變量 */
static pthread_mutex_t __mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t __cond = PTHREAD_COND_INITIALIZER;

static void *thread_waiting(void* arg)
{
	(void) arg;
	printf("thread: %ld waiting ...\r\n", pthread_self());

	/* 阻塞在線程條件變量上, */
	assert(pthread_cond_wait(__cond, __mutex) == 0);

	/* 該線程被喚醒,同時擁有了線程鎖 __mutex */
	printf("thread: %ld wakeup by other thread\r\n", pthread_self());
	return NULL;
}

int main(void)
{
	pthread_t tid;

	/* 建立阻塞在線程條件變量上的子線程 */
	assert(pthread_create(&tid, NULL, thread_waiting, NULL) == 0);
	sleep(10);  /* 主線程休息 10 秒 */

	/* 喚醒阻塞在線程條件變量上的子線程 */
	assert(pthread_cond_signal(__cond) == 0);

	/* 接管子線程的退出狀態 */
	assert(pthread_join(&tid) == 0);

	return 0;
}

       該例子很是簡單,用戶能夠在本身的程序中靈活使用這些 API。資源

 

我的微博:http://weibo.com/zsxxszget

線程編程常見API簡介(上)

線程編程常見API簡介(中)

acl 庫下載:https://sourceforge.net/projects/acl/

相關文章
相關標籤/搜索