1. 程式人生 > >Linux多執行緒──主執行緒和子執行緒分別迴圈一定次數

Linux多執行緒──主執行緒和子執行緒分別迴圈一定次數

條件變數

條件變數是執行緒可用的另一種同步機制。條件變數給多個執行緒提供了一個回合的場所。條件變數與互斥量一起使用時,允許執行緒以無競爭的方式等待鐵定的條件發生。

名稱:

pthread_cond_wait/pthread_cond_timedwait

目標:

條件變數等待

標頭檔案:

#include < pthread.h>

函式原形:

int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);

int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t mytex,const struct timespec *abstime);

引數:

cond 條件變數

mutex 互斥鎖

返回值:

成功返回0,出錯返回錯誤編號。

 第一個引數*cond是指向一個條件變數的指標。第二個引數*mutex則是對相關的互斥鎖的指標。

使用pthread_cond_wait等待條件變數變為真。

傳遞給pthread_cond_wait的互斥量對條件進行保護。呼叫者把鎖住的互斥量傳給函式,函式自動把呼叫執行緒放到等待條件的執行緒列表上,對互斥量解鎖。這就關閉了條件檢查和執行緒進入休眠狀態等待條件改變這兩個操作之間的時間通道,這樣執行緒就不會錯過條件的。pthread_cond_wait返回時,互斥量再次被鎖住。

示例

子執行緒迴圈 10 次,接著主執行緒迴圈 100 次,接著又回到子執行緒迴圈 10 次,接著再回到主執行緒又迴圈 100 次,如此迴圈50次,試寫出程式碼

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


#define LOOP 50

int num = 0;
int sub_parm = 0;
int main_parm = 1;

pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t qready = PTHREAD_COND_INITIALIZER;

void* thread_func(void *arg)
{
	int i, j;
	for (i = 0; i < LOOP; i++)
	{
		pthread_mutex_lock(&mylock);
		while (sub_parm != num)
			pthread_cond_wait(&qready, &mylock);

		for (j = 0; j < 10; j++)
			printf("Sub thread: %d\n", j);

		num = (num + 1) % 2;
		pthread_mutex_unlock(&mylock);
		pthread_cond_signal(&qready);
	}

	return (void*) 0;
}

int main()
{
	int i, k;
	pthread_t tid;
	void *tret;

	pthread_create(&tid, NULL, thread_func, NULL);

	for (i = 0; i < LOOP; i++)
	{
		pthread_mutex_lock(&mylock);

		while (main_parm != num)
			pthread_cond_wait(&qready, &mylock);

		for (k = 0; k < 100; k++)
			printf("Main thread: %d\n", k + 100);

		num = (num + 1) % 2;
		pthread_mutex_unlock(&mylock);
		pthread_cond_signal(&qready);
	}

	pthread_join(tid, &tret);
}