linux 多線程,鎖同步

來源:互聯網
上載者:User

 POSIX pthread 

libraries 

是基於標準的線程API的C / C ++。並發執行。這是最有效多處理器或多核心系統的工藝流程,在另一個處理器上運行,從而通過並行或分布式的處理速度越來越快。

 

 

 

簡介:

線程庫提供了三種同步機制:

mutexes:  互斥鎖:主要是阻止其他線程訪問變數,強制線程獨佔一個變數或一組變數

join:         使一個線程等待,直達其他線程完成或者終止(exit(0));

contidion variables: 條件變數,資料類型為 phread_cond_t

詳細介紹:

mutexes: 多線程在同一時間在同一塊記憶體地區操作資料,防止資料的不一致. 掙用或者競爭情況 通常發生在多線程,執行的操作在相同的記憶體地區,比如修改通一個狀態變數。鎖主要是鎖住共用資源, 對於多線程訪問的全家變數,需要添加鎖。看代碼理解

沒有鎖程式碼片段

int counter =0;

void updateCounter()

{

  counter++

};

帶鎖程式碼片段

pthread_mutex_t mutext =PTHREAD_MUTEX_INITIALIZER

int counter =0;

void updateCounter()

{

  pthread_mutex_lock(&mutext);

  counter++

 pthread_mutex_unlock(&mutext);

};

重點說明

pthread_mutex_lock() : 獲得指定的互斥變數上的鎖。如果該互斥已經被另一個線程鎖定,這個調用會阻塞調用線程,直到互斥量被釋放

pthread_mutex_unlock() - 解除鎖定的互斥變數。如果已經解鎖或由另一個線程擁有互斥,則返回一個錯誤

pthread_mutex_trylock() - 試圖鎖定一個互斥體,會返回錯誤碼。主要用於防止死結條件

互斥鎖Demo 

 

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

void * updateCounter();

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter =0;

main(){

  int rc1,rc2;
  pthread_t thread1,thread2;
  if( (rc1=pthread_create( &thread1, NULL, &updateCounter, NULL)) )
    {
       printf("Thread creation failed: %d\n", rc1);
    }
   if( (rc2=pthread_create( &thread2, NULL, &updateCounter, NULL)) )
     {
         printf("Thread creation failed: %d\n", rc2);
     }
   
    pthread_join( thread1, NULL);
    pthread_join( thread2, NULL);

   exit(0);

}

void * updateCounter(){
 
   pthread_mutex_lock( &mutex1 );

   counter++;

   printf("Counter value: %d\n",counter);

   pthread_mutex_unlock( &mutex1 );
}

 

gcc -lpthread mutex1.c -o mutext.out

輸出:

DavidYang:項目 weflytotti$ ./mutext.out

Counter value: 1

Counter value: 2

Joins Demo

Joins:等待其他線程完成,一個線程發送器可以啟動多個線程,然後等待他們完成 

具體代碼

 

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

#define NTHREADS 10
void *thread_function(void *);
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int  counter = 0;

main()
{
   pthread_t thread_id[NTHREADS];
   int i, j;

   for(i=0; i < NTHREADS; i++)
   {
      pthread_create( &thread_id[i], NULL, thread_function, NULL );
   }

   for(j=0; j < NTHREADS; j++)
   {
      pthread_join( thread_id[j], NULL);
   }
 
                                            
   printf("Final counter value: %d\n", counter);
}

void *thread_function(void *dummyPtr)
{
   printf("Thread number %ld\n", pthread_self());
   pthread_mutex_lock( &mutex1 );
   counter++;
   pthread_mutex_unlock( &mutex1 );
}

 

輸出:

gcc -lpthread join.c -o join.out

DavidYang:項目 weflytotti$ ./join.out

Thread number 4304330752

Thread number 4305981440

Thread number 4306518016

Thread number 4307054592

Thread number 4307591168

Thread number 4308127744

Thread number 4308664320

Thread number 4309200896

Thread number 4309737472

Thread number 4310274048

Final counter value: 10

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.