linux下生產者消費者 多線程演示程序

基本API介紹

線程linux

線程建立:
int pthread_create(pthread *thread, pthread_attr_t *attr, void* (*start_routine)(*void), void* arg);
第一個參數爲指向線程
第二個參數用來設置線程屬性。
第三個參數是線程運行函數的起始地址
第四個參數是運行函數的參數。 其中pthread_attr_t*和void* arg可設置爲NULL;

 int pthread_join(pthread_t thread, void **retval);
第一個參數爲被等待的線程標識符,
第二個參數爲一個用戶自定義指針,用來存儲被等待線程的返回值。
這個函數是一個線程阻塞的函數,調用它的函數將一直等待到線程結束爲止,當函數返回時,被等待線程的資源被收回。若是執行成功,將返回0,若是失敗則返回一個錯誤號。ios

互斥量函數

初始化:
函數: int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
該函數以動態方式建立互斥鎖的,參數attr指定了新建互斥鎖的屬性。若是參數attr爲空,則使用默認的互斥鎖屬性,默認屬性爲快速互斥鎖 。互斥鎖的屬性在建立鎖的時候指定,在LinuxThreads實現中僅有一個鎖類型屬性,不一樣的鎖類型在試圖對一個已經被鎖定的互斥鎖加鎖時表現不一樣。成功完成以後會返回零,其餘任何返回值都表示出現了錯誤。post

上鎖:
int pthread_mutex_lock(pthread_mutex_t *mutex);
 返回值:在成功完成以後會返回零。其餘任何返回值表示出現錯誤。若是出現如下任一狀況,該函數將失敗並返回對應的值。spa

 解鎖:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
釋放互斥鎖,與pthread_mutex_lock成對存在。線程

信號量

信號量的數據類型爲結構sem_t,它本質上是一個長整型的數。
函數sem_init()用來初始化一個信號量。
int sem_init (sem_t *sem, int pshared, unsigned int value);
對由sem指定的信號量進行初始化,設置好它的共享選項,並指定一個整數類型的初始值。
pshared參數控制着信號量的類型, pshared的值若爲0,表示是進程內共享信號量;不然,進程間可共享該信號量。指針

sem_post( sem_t *sem )用來增長信號量的值。當有線程阻塞在這個信號量上時,調用這個函數可喚醒被阻塞的線程。rest

sem_wait( sem_t *sem ),表示等待信號量,若該信號量不可獲取,則阻塞,解除阻塞後將sem的值減一,代表公共資源經使用後減小。code

sem_destroy(sem_t *sem)用來釋放信號量sem。進程

上代碼:

#include <iostream> 
#include <vector>
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>

using namespace std;

#define MAX_SIZE 100

vector<int> buffer;		//共享數據緩衝區
pthread_mutex_t mutex; 	        //緩衝區訪問互斥量
sem_t full;			//緩衝區有有數據信號量
sem_t empty;			//緩衝區空閒數據信號量


void* producer(void*)    //生產者
{
	for (int i = 0; i < MAX_SIZE; i++)
	{
		sem_wait(&empty);	//緩衝區如有空閒空間,放數據,不然阻塞
		pthread_mutex_lock(&mutex);
		buffer.push_back(i);
		cout<<"producer:	"<<i<<endl;
		pthread_mutex_unlock(&mutex);
		sem_post(&full);
		sleep(0.02);
	}
};

void* consumer(void*)    //消費者
{
		int nMsgCount = 0;
		
		while(nMsgCount < MAX_SIZE) 
                {
			sem_wait(&full);	//緩衝區有數據,取數據,不然阻塞
			
                        pthread_mutex_lock(&mutex);			
			vector<int>::iterator iter = buffer.begin();
			int value = *iter;
			buffer.erase(iter);	
			cout<<"consumer: "<<value<<endl;		
			pthread_mutex_unlock(&mutex);
			
                        sem_post(&empty);
			nMsgCount++;
			sleep(0.05);
		}
}


int main()
{
        //互斥量、信號量初始化
	pthread_mutex_init(&mutex,NULL);
	sem_init(&full, 0, 0);
	sem_init(&empty, 0, MAX_SIZE);

        //建立線程
	pthread_t producerTd;
	pthread_t consumerTd;
	int nProducerId = pthread_create(&producerTd, NULL, producer, NULL);
	int nConusmerId = pthread_create(&consumerTd, NULL, consumer, NULL);

	sleep(100);

        //相關資源銷燬
	sem_destroy(&full);
	sem_destroy(&empty);

	pthread_join(producerTd,NULL);
	pthread_join(consumerTd,NULL);
	return 0;
}

結果演示

 

這是第一次在VI下寫linux的程序,和VS2005+VISUAL ASSIST相比,沒有高亮,沒有智能提示,用VI好痛苦~

相關文章
相關標籤/搜索