Linux C++:多線程-互斥鎖

    以前學過c的多線程任務和鎖一些相關知識,由於工作原因做Android去了,很多東西也都忘記的差不多了,現在趁學C++時來重新回顧複習一些,因爲C++是C的加強版很多東西都是兼容的,因此學起來也比較容易。 

多線程:多線程是多任務處理的一種特殊形式,多任務處理允許讓電腦同時運行兩個或兩個以上的程序。一般情況下,兩種類型的多任務處理:基於進程和基於線程。

  • 基於進程的多任務處理是程序的併發執行。
  • 基於線程的多任務處理是同一程序的片段的併發執行。

多線程的優點:

  1. 無需跨進程邊界;
  2. 程序邏輯和控制方式簡單;
  3. 所有線程可以直接共享內存和變量等;
  4. 線程方式消耗的總資源比進程方式好;

多線程的缺點:

  1. 每個線程與主程序共用地址空間,受限於2GB地址空間;
  2. 線程之間的同步和加鎖控制比較麻煩;
  3. 一個線程的崩潰可能影響到整個程序的穩定性;
  4. 線程能夠提高的總性能有限,而且線程多了之後,線程本身的調度也是一個麻煩事兒,需要消耗較多的CPU;

線程互斥鎖:

    由於多線程是共享進程資源,併發執行。當某個線程訪問資源時,其它線程就不可以訪問,只能等到該線程運行完這片段後才纔可以運行。這個需要lock。

鎖的實現:

pthread_mutex_t mutex1; //mutex1聲明格式:
pthread_mutex_init(&mutex1,NULL); //初始化互斥鎖
pthread_mutex_lock(&mutex1); //加鎖
pthread_mutex_trylock(&mutex1);//試着去加鎖
pthread_mutex_unlock(&mutex1); //去鎖
pthread_mutex_destroy(&mutex1); //釋放鎖資源。

示例(鏈接-lpthread): 

#include <iostream>
#include <pthread.h>
#include <unistd.h>

using namespace std;

pthread_mutex_t mutex1 ;

void *myid1(void *arg)
{
    pthread_mutex_lock(&mutex1); //上鎖
    int a = *((int *)arg);
    for(int i = 0; i < 5;i++)
    {
        // sleep(1);
        cout<<"__"<<a<<"__mydi_1111"<<endl;
    }
    pthread_mutex_unlock(&mutex1); //開鎖
}

void *myid2(void *arg)
{
    pthread_mutex_lock(&mutex1);
    int a = *((int *)arg);
    for(int i = 0; i < 5;i++)
    {
        // sleep(1);
        cout<<"__"<<a<<"__myid_2222"<<endl;
    }
    pthread_mutex_unlock(&mutex1);
}

void *myid3(void *arg)
{
    pthread_mutex_lock(&mutex1);
    int a = *((int *)arg);
    for(int i = 0; i < 5; i++)
    {
        // sleep(1);
        cout<<"__"<<a<<"__myid_3333"<<endl;
    }
    pthread_mutex_unlock(&mutex1);
}

int main()
{
    pthread_t id1,id2,id3;
    int a = 1;
    int b = 2;
    int c = 3;
    pthread_mutex_init(&mutex1,NULL);//初始化互斥鎖
    
    pthread_create(&id1,NULL,myid1,(void*)&a);
    pthread_create(&id2,NULL,myid2,(void*)&b);
    pthread_create(&id3,NULL,myid3,(void*)&c);

    pthread_join(id1,NULL);
    pthread_join(id2,NULL);
    pthread_join(id3,NULL);

    pthread_mutex_destroy(&mutex1);

    return 0;
}

待續...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章