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

Linux 多線程同步機制(上)

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

前言


一、線程同步

在多線程環(huán)境下,多個線程可以并發(fā)地執(zhí)行,訪問共享資源(如內(nèi)存變量、文件、網(wǎng)絡(luò)連接  等)。
這可能導致 數(shù)據(jù)不一致性, 死鎖, 競爭條件等 問題。
為了解決這些問題,需要使用同步機制來確保線程間的協(xié)作和互斥訪問共享資源。

“同步” 的目的 是為了避免數(shù)據(jù)的混亂,解決與時間有關(guān)的錯誤。實際上,不僅線程需要同步,進程間,信號間等等都需要同步機制。

線程同步,指一個線程發(fā)出某一功能調(diào)用時,在沒有得到結(jié)果之前,該調(diào)用不返回。同時 其他線程為保證數(shù)據(jù)的一致性,不能調(diào)用該功能。

二、互斥量 mutex

互斥鎖(Mutex,全稱為 Mutual Exclusion)是一種常用的同步機制,用于保護共享資源免受多個線程同時訪問和修改的影響?;コ怄i提供了一種互斥訪問的機制,同一時間只允許一個線程獲取鎖并訪問被保護的資源。

每個線程在對資源操作前都嘗試進行先加鎖,成功加鎖才能操作,操作結(jié)束解鎖。
資源還是共享的,線程也還是競爭的。
但 通過 “鎖” 就將資源的訪問變成互斥操作,而后與時間有關(guān)的錯誤也就不會再產(chǎn)生了。

1. 互斥鎖的基本操作包括兩個關(guān)鍵操作:

  • 加鎖(Lock):線程通過申請互斥鎖來獲取對共享資源的訪問權(quán)。如果互斥鎖當前未被其他線程獲取,線程成功獲得鎖然后進入臨界區(qū)(Critical Section),可以訪問共享資源。如果互斥鎖已經(jīng)被其他線程獲取,申請鎖的線程將被阻塞,直到鎖被釋放。

  • 解鎖(Unlock):線程在完成對共享資源的訪問之后,釋放互斥鎖,使得其他線程可以申請并獲取鎖。

2. 互斥鎖的主要應(yīng)用函數(shù) :

pthread_mutex_init: 用于初始化互斥鎖變量。
pthread_mutex_destroy: 用于銷毀互斥鎖對象。
pthread_mutex_lock: 用于加鎖,如果互斥鎖已被其他線程占用,則當前線程阻塞。
pthread_mutex_trylock: 嘗試加鎖,如果互斥鎖已被其他線程占用,則返回一個失敗狀態(tài)而不阻塞線程。
pthread_mutex_unlock: 用于解鎖,釋放互斥鎖使其他線程可以獲取。

3. 初始化線程鎖 :
有兩種方式可以對互斥鎖進行初始化:靜態(tài)初始化和動態(tài)初始化。

  • 靜態(tài)初始化: 是在定義互斥鎖變量時直接進行初始化,不需要調(diào)用特定的初始化函數(shù)。
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    PTHREAD_MUTEX_INITIALIZER 是一個宏,用于靜態(tài)初始化互斥鎖變量。
  • 動態(tài)初始化:動態(tài)初始化是在運行時使用初始化函數(shù)對互斥鎖進行初始化。
    pthread_mutex_init(&mutex, NULL);

4. 示例代碼
在下面代碼中,main 函數(shù)中有一個主線程 打印小寫字母,my_thread 為 子線程 打印 大寫字母。兩個線程通過互斥鎖來訪問 共享資源。

#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

pthread_mutex_t lock;							// 創(chuàng)建 互斥鎖

void *my_thread(void *arg)
{
	srand(time(NULL));							// 設(shè)置隨機種子
	
	while(1)
	{
		pthread_mutex_lock(&lock);
		printf("ABC ");
		sleep(rand() % 3);
		printf("XYZ\n");

		pthread_mutex_unlock(&lock);
		sleep(rand() % 3);							// 休眠隨機秒,釋放cpu資源
	}
	
	pthread_exit(NULL);
}


int main(void)
{
	pthread_t tid;
	int ret;

	srand(time(NULL));									// 設(shè)置隨機種子

	ret = pthread_mutex_init(&lock,  NULL);				// 初始化互斥鎖
	if(ret != 0)
	{
		printf("pthread_mutex_init err\n");
	}

	ret = pthread_create(&tid, NULL, my_thread, NULL);
	if(ret != 0)
	{
		printf("pthread_create err\n");
	}

	while(1)
	{
		pthread_mutex_lock(&lock);
		printf("abc ");
		sleep(rand() % 3);
		printf("xyz\n");

		pthread_mutex_unlock(&lock);
		sleep(rand() % 3);
	}

	pthread_mutex_destroy(&lock);			  	// 銷毀 互斥鎖

	pthread_join(tid,NULL);				  		// 等待回收線程,獲取回收狀態(tài)

	return 0;
}

注意 :
鎖粒度(Lock Granularity):鎖的粒度應(yīng)該盡可能小,以避免鎖定過長時間,從而降低了并發(fā)性能。

三、死鎖

死鎖產(chǎn)生的原因:死鎖是指多個線程或進程因為彼此相互等待對方所持有的資源而無法繼續(xù)執(zhí)行的狀態(tài)。

解決:

  1. 使用資源的有序性:通過規(guī)定線程獲取資源的順序,避免出現(xiàn)循環(huán)等待的情況。例如,可以約定所有線程按照一定的順序獲取資源,從而避免死鎖的發(fā)生。

如果下面兩個線程 獲取資源的順序是相反的,則可能會產(chǎn)生死鎖。可以將 線程 B 先獲取 m1鎖,再獲取 m2鎖。
Linux 多線程同步機制(上),linux,linux,java,數(shù)據(jù)庫,多線程,互斥量mutex
以下面代碼的方式獲取鎖,不會存在死鎖風險。文章來源地址http://www.zghlxwxcb.cn/news/detail-684682.html

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

pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;

void *my_thread1(void *arg)
{
	pthread_mutex_lock(&lock1);
	printf("my_thread1 : begin\n");

	pthread_mutex_lock(&lock2);
	printf("my_thread1 : end\n");

	pthread_mutex_unlock(&lock2);
	pthread_mutex_unlock(&lock1);
	
	pthread_exit(NULL);
}

void *my_thread2(void *arg)
{
	pthread_mutex_lock(&lock1);
	printf("my_thread2 : begin\n");

	pthread_mutex_lock(&lock2);
	printf("my_thread2 : end\n");

	pthread_mutex_unlock(&lock2);
	pthread_mutex_unlock(&lock1);
	
	pthread_exit(NULL);
}

int main(void)
{
	pthread_t tid1,tid2;
	int ret;

	ret = pthread_create(&tid1, NULL, my_thread1, NULL);
	if(ret != 0)
	{
		printf("pthread1_create err\n");
	}

	ret = pthread_create(&tid2, NULL, my_thread2, NULL);
	if(ret != 0)
	{
		printf("pthread2_create err\n");
	}

	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

	return 0;
}
  1. 設(shè)置超時機制:在請求資源時,設(shè)置一個超時時間,在超過該時間后如果仍未獲得資源,則放棄等待,釋放已經(jīng)獲取的資源,避免長時間的死鎖等待。

總結(jié)

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

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

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

相關(guān)文章

  • java springboot架構(gòu) 自定義注解保存項目業(yè)務(wù)日志,使用線程池保存到數(shù)據(jù)庫

    目錄 1:pom.xml依賴 2:注解類樣例 3:枚舉類 4:具體處理方法類 5:線程池類 1:pom.xml依賴 2:注解類樣例 3:枚舉類 4:具體處理方法類 5:線程池類

    2024年02月15日
    瀏覽(53)
  • Linux和windows進程同步與線程同步那些事兒(三): Linux線程同步詳解示例

    Linux和windows進程同步與線程同步那些事兒(一) Linux和windows進程同步與線程同步那些事兒(二): windows線程同步詳解示例 Linux和windows進程同步與線程同步那些事兒(三): Linux線程同步詳解示例 Linux和windows進程同步與線程同步那些事兒(四):windows 下進程同步 Linux和wi

    2024年02月01日
    瀏覽(34)
  • Linux達夢數(shù)據(jù)庫安裝

    Linux達夢數(shù)據(jù)庫安裝

    說明: 達夢官方推薦是創(chuàng)建新的用戶進行安裝,但是在公司自己私創(chuàng)用戶是違規(guī)的,也可以直接使用root用戶進行安裝,新用戶和使用root安裝不同點我會標注出來。 a、創(chuàng)建用戶組dinstall. ??groupadd dinstall ?b、創(chuàng)建安裝用戶dmdba. ??useradd -g dinstall -m -d /home/dmdba -s /bin/bash d

    2024年02月09日
    瀏覽(29)
  • 數(shù)據(jù)庫定時備份linux篇

    數(shù)據(jù)庫定時備份linux篇

    目錄 1 序言 2 crond 相關(guān)知識點 2.1 crond 是什么? 2.2 crontab 進行定時任務(wù)設(shè)置 2.2.1 crontab 指令選項說明 2.2.2 crontab 指令使用格式 2.2.3 特定時間執(zhí)行任務(wù)例子 2.2.4 crontab 設(shè)置步驟 3 各個數(shù)據(jù)庫備份腳本 3.1 Oracle數(shù)據(jù)庫 3.2 Mysql數(shù)據(jù)庫 3.3 postgresql數(shù)據(jù)庫 3.4 mongoDB數(shù)據(jù)庫 4 定時備份數(shù)據(jù)

    2024年02月04日
    瀏覽(21)
  • Linux 使用bash創(chuàng)建MYSQL數(shù)據(jù)庫并導入數(shù)據(jù)庫文件

    Linux 使用bash創(chuàng)建MYSQL數(shù)據(jù)庫并導入數(shù)據(jù)庫文件

    主要是杠一下的數(shù)據(jù)庫123-456.sql,這個神經(jīng)病一樣,試了很多寫法

    2024年01月22日
    瀏覽(29)
  • Linux 線程和線程同步

    ?【操作系統(tǒng)】2.進程和線程 - imXuan - 博客園 (cnblogs.com) 線程:light weight process(LWP)輕量級的進程,在 Linux 中本質(zhì)上仍然是一個進程 進程:有獨立的地址空間,獨立PCB,可以當作只有一個線程的進程。進程是計算機 資源分配的最小單位 線程:有獨立的PCB,共享物理地址空間

    2024年02月05日
    瀏覽(21)
  • linux環(huán)境安裝mysql數(shù)據(jù)庫

    linux環(huán)境安裝mysql數(shù)據(jù)庫

    一:查看是否自帶mariadb數(shù)據(jù)庫 命令:rpm -qa | grep mariadb 如果自帶數(shù)據(jù)庫則卸載掉重新安裝 命令:yum remove mariadb-connector-c-3.1.11-2.el8_3.x86_64 二:下載mysql 命令:wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 注意:如果出現(xiàn)No such file or directory,運行命令:su root 三

    2024年02月15日
    瀏覽(32)
  • Linux下oracle數(shù)據(jù)庫啟動

    Linux下oracle數(shù)據(jù)庫啟動

    1.登錄到Linux服務(wù)器(ssh) 2.切換到oracle用戶權(quán)限 (命令是: # su –l oracle ) 3.進入sqlplus界面(命令是:$ sqlplus /nolog 或 sqlplus / as sysdba) 原本的畫面會變?yōu)?SQL 接著請輸入 SQLconn / as sysdba ; 輸入 SQL startup (作用:啟動數(shù)據(jù)庫實例) 另外停止數(shù)據(jù)庫的指令如下: SQL shutdown immediate 回到

    2024年02月10日
    瀏覽(94)
  • Linux 導入MySQL數(shù)據(jù)庫(四)

    Linux 導入MySQL數(shù)據(jù)庫(四)

    一、導出數(shù)據(jù)庫用mysqldump命令(注意mysql的安裝路徑,即此命令的路徑): 1、導出數(shù)據(jù)和表結(jié)構(gòu): 敲回車后會提示輸入密碼 PS: 在Linux命令中, 符號用于將命令的輸出重定向到文件中。在這個例子中,mysqldump命令將數(shù)據(jù)庫abc的數(shù)據(jù)和表結(jié)構(gòu)導出到一個名為abc.sql的文件中。如

    2024年02月09日
    瀏覽(29)
  • linux系統(tǒng)--------------mysql數(shù)據(jù)庫管理

    linux系統(tǒng)--------------mysql數(shù)據(jù)庫管理

    目錄 一、SQL語句 1.1SQL語言分類 1.2查看數(shù)據(jù)庫信息? ? 1.3登錄到你想登錄的庫 1.4查看數(shù)據(jù)庫中的表信息 1.5顯示數(shù)據(jù)表的結(jié)構(gòu)(字段) 1.5.1數(shù)據(jù)表的結(jié)構(gòu) 1.5.2常用的數(shù)據(jù)類型: 二、關(guān)系型數(shù)據(jù)庫的四種語言 2.1DDL:數(shù)據(jù)定義語言,用于創(chuàng)建數(shù)據(jù)庫對象,如庫、表、索引等 2.1.1庫

    2024年03月24日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包