国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

線程的同步和互斥學(xué)習(xí)筆記

這篇具有很好參考價值的文章主要介紹了線程的同步和互斥學(xué)習(xí)筆記。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

互斥鎖的概念和使用?

線程通信-互斥

?互斥鎖的創(chuàng)建和銷毀

?申請鎖-pthread_mutex_lock

?釋放鎖-pthread_mutex_unlock

讀寫鎖的概念和使用

死鎖的避免


互斥鎖的概念和使用?

線程通信-互斥

臨界資源

  • 一次只允許一個任務(wù)(進程、線程)訪問的共享資源

概念:

????????不能同時訪問的資源,比如寫文件,只能由一個線程寫,同時寫會寫亂。

????????比如外設(shè)打印機,打印的時候只能由一個程序使用。

????????外設(shè)基本上都是不能共享的資源。

????????生活中比如衛(wèi)生間,同一時間只能由一個人使用。

臨界區(qū)

  • 訪問臨界資源的代碼

互斥機制

  • mutex互斥鎖,任務(wù)訪問臨界資源前申請鎖,訪問完后釋放鎖

?互斥鎖的創(chuàng)建和銷毀

兩種方法創(chuàng)建互斥鎖,靜態(tài)方式和動態(tài)方式:?

動態(tài)方式:?

#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,
    const pthread_mutexattr_t *attr);
  • 成功時返回0,失敗時返回錯誤碼
  • mutex指向要初始化的互斥鎖對象
  • attr互斥鎖屬性,NULL表示缺省屬性
  • man函數(shù)出現(xiàn)No manual entry for pthread_mutex_xxx解決方法:apt-get install manpages-posix-dev

?靜態(tài)方式:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

?鎖的銷毀:

int pthread_mutex_destory(pthread_mutex_t *mutex)

在linux中,互斥鎖并不占用任何資源,因此LinuxThreads中的pthread_mutex_destory()除了檢查鎖狀態(tài)以外(鎖定狀態(tài)則返回EBUSY)沒有其他動作。

?申請鎖-pthread_mutex_lock

#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
  • 成功時返回0,失敗時返回錯誤碼
  • mutex指向要初始化的互斥鎖對象
  • pthread_mutex_lock如果無法獲得鎖,任務(wù)阻塞
  • pthread_mutex_trylock如果無法獲得鎖,返回EBUSY而不是掛起等待

?釋放鎖-pthread_mutex_unlock

#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
  • 成功時返回0,失敗時返回錯誤碼
  • mutex指向要初始化的互斥鎖對象

?示例代碼:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
FILE *fp;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;  //多個文件需要多個鎖
void *func1(void *arg)
{
    pthread_detach(pthread_self());
    printf("This is child thread1\n");
    char str[] = "I write func1 line\n";
    char c;
    int i = 0;
    //pthread_mutex_t mutex1;
    while (1)
    {
        pthread_mutex_lock(&mutex);
        while(i < strlen(str))
        {
            c = str[i];
            fputc(c,fp);
            usleep(1);
            i++;
        }
        pthread_mutex_unlock(&mutex);
        i = 0;
        usleep(1);
    }
    
    pthread_exit("func1 exit");
}
void *func2(void *arg)
{
    pthread_detach(pthread_self());
    printf("This is child thread2\n");
    char str[] = "You read func1 thread\n";
    char c;
    int i = 0;
    //pthread_mutex_t mutex2;
    while (1)
    {
        pthread_mutex_lock(&mutex);
        while(i < strlen(str))
        {
            c = str[i];
            fputc(c,fp);
            usleep(1);
            i++;
        }
        pthread_mutex_unlock(&mutex);
        i = 0;
        usleep(1);
    }
    pthread_exit("func2 exit");
}
int main()
{ 
    pthread_t tid1,tid2;
    void *retv;
    int i;   
    fp = fopen("1.txt","a+");
    if(fp == NULL)
    {
        perror("fopen");
        return 0;
    }
    pthread_create(&tid1,NULL,func1,NULL);
    pthread_create(&tid2,NULL,func2,NULL);
    while(1)
    {
        sleep(1);
    }
}

運行結(jié)果:

線程的同步和互斥學(xué)習(xí)筆記,Linux學(xué)習(xí)筆記,學(xué)習(xí),筆記,linux

讀寫鎖的概念和使用

?必要性:提高線程執(zhí)行效率

特性:

  • 寫者:寫者使用寫鎖,如果當(dāng)前沒有讀者,也沒有其他寫者,寫者立即獲得寫鎖;否則寫者將等待,直到?jīng)]有讀者和寫者。
  • 讀者:讀者使用讀鎖,如果當(dāng)前沒有寫者,讀者立即獲得讀鎖;否則讀者等待,直到?jīng)]有寫者。

?注意:

  • 同一時刻只有一個線程可以獲得寫鎖,同一時刻可以有多個線程獲得讀鎖。
  • 讀寫鎖出于寫鎖狀態(tài)時,所有試圖對讀寫鎖加鎖的線程,不管是讀者試圖加讀鎖,還是寫者試圖加寫鎖,都會被阻塞。
  • 讀寫鎖處于讀鎖狀態(tài)時,有寫者試圖加寫鎖時,之后的其他線程的讀鎖請求會被阻塞,以避免寫者長時間的不寫鎖。
  • ?初始化一個讀寫鎖? ? ? ? pthread_rwlock_init
  • 讀鎖定讀寫鎖? ? ? ? ? ? ? ? pthread_rwlock_rdlock
  • 非阻塞讀鎖定? ? ? ? ? ? ? ? pthread_rwlock_tryrdlock
  • 寫鎖定讀寫鎖? ? ? ? ? ? ? ? pthread_rwlock_wrlock
  • 非阻塞寫鎖定? ? ? ? ? ? ? ? pthread_rwlock_trywrlock
  • 解鎖讀寫鎖? ? ? ? ? ? ? ? ? ? pthread_rwlock_unlock
  • 釋放讀寫鎖? ? ? ? ? ? ? ? ? ? pthread_rwlock_destroy

?示例代碼:

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


pthread_rwlock_t rwlock;

FILE *fp;
void * read_func(void *arg){
    pthread_detach(pthread_self());
    printf("read thread\n");
    char buf[32]={0};
    while(1){
        //rewind(fp);
        pthread_rwlock_rdlock(&rwlock);
        while(fgets(buf,32,fp)!=NULL){
            printf("%d,rd=%s\n",(int)arg,buf);
            usleep(1000);
        }
        pthread_rwlock_unlock(&rwlock);
        sleep(1);
    }

}



void *func2(void *arg){
    pthread_detach(pthread_self());
    printf("This func2 thread\n");
    
    char str[]="I write func2 line\n";
    char c;
    int i=0;
    while(1){
        pthread_rwlock_wrlock(&rwlock);
        while(i<strlen(str))
        {
            c = str[i];
            fputc(c,fp);
            usleep(1);
            i++;
        }
        pthread_rwlock_unlock(&rwlock);
        i=0;
        usleep(1);

    }

    pthread_exit("func2 exit");

}

void *func(void *arg){
    pthread_detach(pthread_self());
    printf("This is func1 thread\n");
    char str[]="You read func1 thread\n";
    char c;
    int i=0;
    while(1){
        pthread_rwlock_wrlock(&rwlock);
        while(i<strlen(str))
        {
            c = str[i];
            fputc(c,fp);
            i++;
            usleep(1);
        }
        pthread_rwlock_unlock(&rwlock);
        i=0;
        usleep(1);

    }
    pthread_exit("func1 exit");
}


int main(){
    pthread_t tid1,tid2,tid3,tid4;
    void *retv;
    int i;
    fp = fopen("1.txt","a+");
    if(fp==NULL){
        perror("fopen");
        return 0;
    }
    pthread_rwlock_init(&rwlock,NULL);
    pthread_create(&tid1,NULL,read_func,1);
    pthread_create(&tid2,NULL,read_func,2);
    pthread_create(&tid3,NULL,func,NULL);
    pthread_create(&tid4,NULL,func2,NULL);
    while(1){    
        sleep(1);
    } 

}

死鎖的避免

  • 鎖越少越好,最好使用一把鎖
  • 調(diào)整好鎖的順序
  • 使鎖進行錯位

示例代碼:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
FILE *fp;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;  //多個文件需要多個鎖
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;  //多個文件需要多個鎖

void *func1(void *arg)
{
    pthread_detach(pthread_self());
    printf("This is child thread1\n");
    char str[] = "I write func1 line\n";
    char c;
    int i = 0;
    //pthread_mutex_t mutex1;
    while (1)
    {
        pthread_mutex_lock(&mutex2);
        printf("%d,I get lock2\n",(int)arg);
        sleep(1);
        pthread_mutex_lock(&mutex);
        printf("%d,I get 2 locks\n",(int)arg);
        pthread_mutex_unlock(&mutex);
        pthread_mutex_unlock(&mutex2);
        sleep(10);
    }
    
    pthread_exit("func1 exit");
}
void *func2(void *arg)
{
    pthread_detach(pthread_self());
    printf("This is child thread2\n");
    char str[] = "You read func1 thread\n";
    char c;
    int i = 0;
    //pthread_mutex_t mutex2;
    while (1)
    {
        pthread_mutex_lock(&mutex);
        printf("%d,I get lock1\n",(int)arg);
        sleep(1);
        pthread_mutex_lock(&mutex2);
        printf("%d,I get 2 locks\n",(int)arg);

        pthread_mutex_unlock(&mutex2);
        pthread_mutex_unlock(&mutex);
        usleep(10);
    }
    pthread_exit("func2 exit");
}
int main()
{ 
    pthread_t tid1,tid2;
    void *retv;
    int i;   
    fp = fopen("1.txt","a+");
    if(fp == NULL)
    {
        perror("fopen");
        return 0;
    }
    pthread_create(&tid1,NULL,func1,1);
    sleep(5);
    pthread_create(&tid2,NULL,func2,2);
    while(1)
    {
        sleep(1);
    }
}

?運行結(jié)果:

線程的同步和互斥學(xué)習(xí)筆記,Linux學(xué)習(xí)筆記,學(xué)習(xí),筆記,linux文章來源地址http://www.zghlxwxcb.cn/news/detail-822424.html

到了這里,關(guān)于線程的同步和互斥學(xué)習(xí)筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Linux——多線程,互斥與同步

    Linux——多線程,互斥與同步

    目錄 一.linux互斥 1.進程線程間的互斥相關(guān)背景概念 2.互斥量mutex 3.加鎖互斥鎖mutex 4.鎖的底層原理 ?二.可重入VS線程安全 1.概念 2.常見的線程不安全的情況 3.常見的線程安全的情況? 4.常見不可重入的情況? 5..常見可重入的情況 6.可重入與線程安全聯(lián)系 ?三.死鎖 1.死鎖四個必

    2024年02月05日
    瀏覽(20)
  • Linux——線程的同步與互斥

    Linux——線程的同步與互斥

    目錄 模擬搶火車票的過程 代碼示例 thread.cc Thread.hpp 運行結(jié)果 分析原因 tickets減到-2的本質(zhì)? 解決搶票出錯的方案 臨界資源的概念 原子性的概念 加鎖 定義 初始化 銷毀 代碼形式如下 代碼示例1: 代碼示例2: 總結(jié) 如何看待鎖 申請失敗將會阻塞 ?pthread_mutex_tyrlock 互斥鎖實現(xiàn)

    2024年02月06日
    瀏覽(27)
  • 【Linux】多線程互斥與同步

    【Linux】多線程互斥與同步

    互斥 指的是一種機制,用于確保在同一時刻只有一個進程或線程能夠訪問共享資源或執(zhí)行臨界區(qū)代碼。 互斥的目的是 防止多個并發(fā)執(zhí)行的進程或線程訪問共享資源時產(chǎn)生競爭條件,從而保證數(shù)據(jù)的一致性和正確性 ,下面我們來使用多線程來模擬實現(xiàn)一個搶票的場景,看看所

    2024年02月09日
    瀏覽(17)
  • 『Linux』第九講:Linux多線程詳解(三)_ 線程互斥 | 線程同步

    『Linux』第九講:Linux多線程詳解(三)_ 線程互斥 | 線程同步

    「前言」文章是關(guān)于Linux多線程方面的知識,上一篇是?Linux多線程詳解(二),今天這篇是 Linux多線程詳解(三),內(nèi)容大致是線程互斥與線程同步,講解下面開始! 「歸屬專欄」Linux系統(tǒng)編程 「主頁鏈接」個人主頁 「筆者」楓葉先生(fy) 「楓葉先生有點文青病」「每篇一句

    2024年02月02日
    瀏覽(23)
  • 【關(guān)于Linux中----線程互斥與同步】

    【關(guān)于Linux中----線程互斥與同步】

    先來用代碼模擬一個搶票的場景,四個線程不停地搶票,一共有1000張票,搶完為止,代碼如下: 執(zhí)行結(jié)果如下: 可以看到,最后出現(xiàn)了票數(shù)為負數(shù)的情況,很顯然這是錯誤的,是不應(yīng)該出現(xiàn)的。 為什么會出現(xiàn)這種情況? 首先要明確,上述的幾個線程是不能同時執(zhí)行搶票的

    2023年04月08日
    瀏覽(18)
  • 【Linux】多線程2——線程互斥與同步/多線程應(yīng)用

    【Linux】多線程2——線程互斥與同步/多線程應(yīng)用

    ??上文主要介紹了多線程之間的獨立資源,本文將詳細介紹多線程之間的 共享資源 存在的問題和解決方法。 intro 多線程共享進程地址空間,包括創(chuàng)建的全局變量、堆、動態(tài)庫等。下面是基于全局變量實現(xiàn)的一個多線程搶票的demo。 發(fā)現(xiàn)錯誤:線程搶到負數(shù)編號的票,為什么

    2024年02月10日
    瀏覽(20)
  • 【Linux】多線程 --- 線程同步與互斥+生產(chǎn)消費模型

    【Linux】多線程 --- 線程同步與互斥+生產(chǎn)消費模型

    人生總是那么痛苦嗎?還是只有小時候是這樣? —總是如此 1. 假設(shè)現(xiàn)在有一份共享資源tickets,如果我們想讓多個線程都對這個資源進行操作,也就是tickets- -的操作,但下面兩份代碼分別出現(xiàn)了不同的結(jié)果,上面代碼并沒有出現(xiàn)問題,而下面代碼卻出現(xiàn)了票為負數(shù)的情況,這

    2024年02月06日
    瀏覽(22)
  • Linux pthread線程操作 和 線程同步與互斥操作

    Linux pthread線程操作 和 線程同步與互斥操作

    在Linux系統(tǒng)中玩線程,使用pthread,這篇博客記錄如何 創(chuàng)建線程 和 使用線程 和線程的 同步 與 互斥 。 還有一份nginx線程池的代碼供大家閱讀學(xué)習(xí)! 目錄 一、簡介 什么是線程 線程的優(yōu)點、缺點 線程的應(yīng)用場合 二、線程的使用 1.? 創(chuàng)建線程 - pthread_create 2.? 線程的終止 - pt

    2024年02月02日
    瀏覽(24)
  • 【學(xué)習(xí)筆記】Windows 下線程同步之互斥鎖

    【學(xué)習(xí)筆記】Windows 下線程同步之互斥鎖

    本文所涉及的同步主要描述在 Windows 環(huán)境下的機制,和 Linux 中的同步機制有一定的聯(lián)系,但注意并不完全相同。類似于,Windows 和 Linux 按照自己的方式實現(xiàn)了操作系統(tǒng)中同步機制的概念 本文記錄的是 Windows 下的互斥鎖同步機制,但在 Windows 的同步機制中,其中很多的概念和

    2024年02月06日
    瀏覽(19)
  • 【Linux】多線程02 --- 線程的同步互斥問題及生產(chǎn)消費模型

    【Linux】多線程02 --- 線程的同步互斥問題及生產(chǎn)消費模型

    ?? 作者: 阿潤菜菜 ?? 專欄: Linux系統(tǒng)編程 線程同步互斥問題是指多線程程序中,如何保證共享資源的正確訪問和線程間的協(xié)作。 因為線程互斥是實現(xiàn)線程同步的基礎(chǔ)和前提,我們先講解線程互斥問題。 在多線程中,假設(shè)我們有一個黃牛搶票的代碼,其中有一份共享資源

    2024年02月08日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包