自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

linux多線程機制線程同步

運維 系統(tǒng)運維
目前,許多流行的多任務操作系統(tǒng)都提供線程機制,線程就是程序中的 單個順序控制流。利用多線程進行程序設(shè)計,就是將一個程序(進程)的任務劃分為執(zhí)行的多個部分(線程) ,每一個線程為一個順序的單控制流,而所有線程都是并發(fā)執(zhí)行的......

1.引言

目前,許多流行的多任務操作系統(tǒng)都提供線程機制,線程就是程序中的 單個順序控制流。利用多線程進行程序設(shè)計,就是將一個程序(進程)的任務劃分為執(zhí)行的多個部分(線程) ,每一個線程為一個順序的單控制流,而所有線程都是并發(fā)執(zhí)行的,這樣,多線程程序就可以實現(xiàn)并行計算,高效利用多處理器。線程可分為用戶級線程和內(nèi)核級線 程兩種基本類型。用戶級線程不需要內(nèi)核支持,可以在用戶程序中實現(xiàn),線程調(diào)度、同步與互斥都需要用戶程序自己完成。內(nèi)核級線程需要內(nèi)核參與,由內(nèi)核完成線 程調(diào)度并提供相應的系統(tǒng)調(diào)用,用戶程序可以通過這些接口函數(shù)對線程進行一定的控制和管理。Linux操作系統(tǒng)提供了LinuxThreads庫,它是符合POSIX1003.1c標準的內(nèi)核級多線程函數(shù)庫。在linuxthreads庫中提供了一些多線程編程的關(guān)鍵函數(shù),在多線程編程時應包括pthread.h文件。

2.LinuxThread中的關(guān)鍵庫函數(shù)

2.1線程的創(chuàng)建和終止

int pthread_create(pthread_t * pthread,const pthread_attr_t *attr,void *(*start_routine(*void)),void *arg);調(diào)用此函數(shù)可以創(chuàng)建一個新的線程,新線程創(chuàng)建后執(zhí)行start_routine 指定的程序。其中參數(shù)attr是用戶希望創(chuàng)建線程的屬性,當為NULL時表示以默認的屬性創(chuàng)建線程。arg是向start_routine 傳遞的參數(shù)。當成功創(chuàng)建一個新的線程時,系統(tǒng)會自動為新線程分配一個線程ID號,并通過pthread 返回給調(diào)用者。

void pthread_exit(void *value_ptr);調(diào)用該函數(shù)可以退出線程,參數(shù)value_ptr是一個指向返回狀態(tài)值的指針。

2.2線程控制函數(shù)

pthread_self(void);為了區(qū)分線程,在線程創(chuàng)建時系統(tǒng)為其分配一個唯一的ID號,由pthread_create()返回給調(diào)用者,也可以通過pthread_self()獲取自己的線程ID。

Int pthread_join (pthread- t thread , void * *status);這個函數(shù)的作用是等待一個線程的結(jié)束。調(diào)用pthread_join()的線程將被掛起直到線程ID為參數(shù)thread 指定的線程終止。

int pthread_detach(pthread_t pthread);參數(shù)pthread代表的線程一旦終止,立即釋放調(diào)該線程占有的所有資源。

2.3線程間的互斥

互斥量和臨界區(qū)類似,只有擁有互斥量的線程才具有訪問資源的權(quán)限, 由于互斥對象只有一個,這就決定了任何情況下共享資源(代碼或變量)都不會被多個線程同時訪問。使用互斥不僅能夠在同一應用程序的不同線程中實現(xiàn)資源的安 全共享,而且可以在不同應用程序的線程之間實現(xiàn)對資源的安全共享。Linux中通過pthread_mutex_t來定義互斥體機制完成互斥操作。具體的操作函數(shù)如下

pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);初使化一個互斥體變量mutex,參數(shù)attr表示按照attr屬性創(chuàng)建互斥體變量mutex,如果參數(shù)attr為NULL,則以默認的方式創(chuàng)建。

pthread_mutex_lock(pthread_mutex_t *mutex);給一個互斥體變量上鎖,如果mutex指定的互斥體已經(jīng)被鎖住,則調(diào)用線程將被阻塞直到擁有mutex的線程對mutex解鎖為止。

Pthread_mutex_unlock(pthread_mutex_t *mutex);對參數(shù)mutex指定的互斥體變量解鎖。

2.4線程間的同步

同步就是線程等待某一個事件的發(fā)生,當?shù)却氖录l(fā)生時,被等待的線程和事件一起繼續(xù)執(zhí)行。如果等待的事件未到達則掛起。在linux操作系統(tǒng)中是通過條件變量來實現(xiàn)同步的。

Pthread_cond_init(pthread_cond_t *cond,const pthread_cond_t *attr);這個函數(shù)按參數(shù)attr指定的屬性初使化一個條件變量cond。

Pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);等待一個事件(條件變量)的發(fā)生,發(fā)出調(diào)用的線程自動阻塞,直到相應的條件變量被置1。等待狀態(tài)的線程不占用CPU時間。

pthread_cond_signal(pthread_cond_t *cond);解除一個等待參數(shù)cond指定的條件變量的線程的阻塞狀態(tài)。

3.多線程編程的應用實例

在這里利用多線程技術(shù)實現(xiàn)生產(chǎn)者和消費者問題,生產(chǎn)者線程向一緩沖區(qū)中寫數(shù)據(jù), 消費者線程從緩沖區(qū)中讀取數(shù)據(jù),由于生產(chǎn)者線程和消費者線程共享同一緩沖區(qū),為了正確讀寫數(shù)據(jù),在使用緩沖隊列時必須保持互斥。生產(chǎn)者線程和消費者線程必 須滿足:生產(chǎn)者寫入緩沖區(qū)的數(shù)目不能超過緩沖區(qū)容量,消費者讀取的數(shù)目不能超過生產(chǎn)者寫入的數(shù)目。在程序中使用了一個小技巧來判斷緩沖區(qū)是空還是滿。在初 始化時讀指針和寫指針為0;如果讀指針等于寫指針,則緩沖區(qū)是空的;如果(寫指針+ 1) % N 等于讀指針,則緩沖區(qū)是滿的,%表示取余數(shù),這時實際上有一個單元空出未用。下面是完整的程序段和注釋。

#include<stdio.h>

#include<pthread.h>

#define BUFFER_SIZE 8

struct prodcons {

int buffer[BUFFER_SIZE];

pthread_mutex_t lock;      //互斥LOCK

int readpos , writepos;

pthread_cond_t notempty;   //緩沖區(qū)非空條件判斷

pthread_cond_t notfull;    //緩沖區(qū)未滿條件判斷

};

void init(struct prodcons * b){

pthread_mutex_init(&b->lock,NULL);

pthread_cond_init(&b->notempty,NULL);

pthread_cond_init(&b->notfull,NULL);

b->readpos=0;

b->writepos=0;

}

void put(struct prodcons* b,int data){

pthread-_mutex_lock(&b->lock);

if((b->writepos + 1) % BUFFER_SIZE == b->readpos)

{

pthread_cond_wait(&b->notfull, &b->lock) ;

}

b->buffer[b->writepos]=data;

b->writepos++;

if(b->writepos >= BUFFER_SIZE)

b->writepos=0;

pthread_cond_signal(&b->notempty);

pthread_mutex_unlock(&b->lock);

}

int get(struct prodcons *b){

int data;

pthread_mutex_lock(&b->lock);

if(b->writepos == b->readpos)

{

pthread_cond _wait(&b->notempty, &b->lock);

}

data = b->buffer[b->readpos];

b->readpos++;

if(b->readpos >= BUFFER_SIZE)

b->readpos=0;

pthread_cond_signal(&b->notfull);

pthread_mutex_unlock(&b->lock);

return data;

}

#define OVER (-1)

struct prodcons buffer;

void *producer(void *data)

{

int n;

for(n = 0; n < 10000; n++)

{

printf("%d \n", n) ;

put(&buffer, n);

}

put(&buffer, OVER);

return NULL;

}

void *consumer(void * data)

{

int d;

while(1)

{

d = get(&buffer);

if(d == OVER)

break;

printf("%d\n", d);

}

return NULL;

}

int main(void)

{

pthread_t th_a, th_b;

void *retval;

init(&buffer);

pthread_create(&th_a, NULL, producer, 0);

& nbsp;   pthread_create(&th_b, NULL, consumer, 0);

pthread_join(th_a, &retval);

pthread_join(th_b, &retval);

return 0;

}

上 面的例子中,生產(chǎn)者負責將1到1000的整數(shù)寫入緩沖區(qū),而消費者負責從同一個緩沖區(qū)中讀取寫入的整數(shù)并打印出來。因為生產(chǎn)者和消費者是兩個同時運行的線 程,并且要使用同一個緩沖區(qū)進行數(shù)據(jù)交換,因此必須利用一種機制進行同步。通過上面的例子我們可以看到,多線程的最大好處是,除堆棧之外,幾乎所有的數(shù)據(jù) 均是共享的,因此線程間的通訊效率很高;缺點:因為共享所有數(shù)據(jù),從而非常容易導致線程之間互相破壞數(shù)據(jù),這一點在編程時必須注意。

4.結(jié)束語

Linux中基于POSIX標準的很好的支持了多線程技術(shù),它減少了程序并發(fā)執(zhí)行時的系統(tǒng)開銷,提高了計算機的工作效率。在具體編程過程中要了解線程的間的關(guān)系,還要考慮共享數(shù)據(jù)的保護,在互斥和同步機制下保證代碼的高效運行,程序編譯時用gcc -D –REENTRANT -libpthread.xx.so filename.c編譯。
 

【編輯推薦】

  1. Linux多線程同步之命名管道
  2. Linux多線程同步之消息隊列
  3. linux多線程之線程資源的釋放
責任編輯:趙寧寧 來源: chinaitlab
相關(guān)推薦

2024-07-05 08:32:36

2024-06-28 08:45:58

2010-01-21 11:23:49

Linux多線程同步消息隊列

2010-01-21 11:22:35

Linux多線程同步

2024-07-08 12:51:05

2010-03-15 16:31:34

Java多線程

2015-07-22 09:51:51

iOS開發(fā)線程

2013-07-16 12:13:27

iOS多線程多線程概念GCD

2015-07-22 09:39:38

IOS多線程同步

2009-09-14 19:39:14

批量線程同步

2011-04-14 13:27:53

Synchronize多線程

2010-03-15 19:37:00

Java多線程同步

2023-06-09 07:59:37

多線程編程鎖機制

2009-06-11 11:17:59

Java多線程

2010-01-21 11:25:44

linux多線程線程資源

2011-11-23 10:09:19

Java線程機制

2024-02-27 10:44:58

C#線程后端

2009-03-12 10:52:43

Java線程多線程

2011-06-22 13:47:16

Java多線程

2011-06-22 13:57:54

Java多線程
點贊
收藏

51CTO技術(shù)棧公眾號