1. 程式人生 > >作業系統(Linux)多執行緒--互斥量實現同步

作業系統(Linux)多執行緒--互斥量實現同步

在訊號量中用sem_t結構表示,在互斥量中用pthread_mutexattr_t表示。

使用互斥變數以前,必須首先對它進行初始化,可以把它設定為常量PTHREAD_MUTEX_INITIALIZER(只適合用於靜態分配的互斥量),

也可以用pthread_mutexattr_init函式初始化pthread_mutexatrr_t結構。如果用動態分配(如呼叫malloc函式),在釋放記憶體前

pthread_mutexattr_destroy函式丟棄用完的互斥量。

#include <pthread.h>
int pthread_mutexttr_init(pthread_mutexattr_t *attr);
int pthread_mutexattr_destory(pthread_mutexattr_t *attr);

要預設的屬性初始化互斥量,只需要把attr設定為NULL。

#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutex_t *mutex)

對互斥量進行加鎖,需要呼叫pthread_mutex_lock。如果互斥量已經上鎖,呼叫執行緒將阻塞直到互斥量被解鎖。

對於互斥量解鎖,需要呼叫pthread_mutex_unlock。

如果執行緒不希望被阻塞,它可以呼叫pthred_mutex_trylock嘗試對互斥量進行加鎖。如果呼叫pthread_mutex_trylock時互斥量處於未鎖住狀態,那麼pthread_mutex_trylock

將被鎖住互斥量,不會出現直到返回0,否則pthread_mutex_trylock就會失敗,不能鎖住互斥量,返回EBUY。

一個小例子:

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


pthread_mutex_t mutex;
int i=0;

void* thread_fun1()
{

   while(i<10)
   {
    pthread_mutex_lock(&mutex);
    i+=1;
    printf("i 1: %d\n",i);
    pthread_mutex_unlock(&mutex);
    sleep(2);
  }
}

void* thread_fun2()
{
   while(i<10)
   {
    pthread_mutex_lock(&mutex);
    i=i+2;
    printf("i 2: %d\n",i);
    pthread_mutex_unlock(&mutex);
    sleep(2);
    }
}

int main()
{
     pthread_t t1,t2;
     pthread_mutex_init(&mutex,NULL);
     pthread_create(&t1,NULL,thread_fun1,NULL);
     pthread_create(&t2,NULL,thread_fun2,NULL);

     pthread_join(t1,NULL);
     pthread_join(t2,NULL);

     printf("\n");
     return 0;
}




執行結果:


相關推薦

作業系統Linux執行--互斥實現同步

在訊號量中用sem_t結構表示,在互斥量中用pthread_mutexattr_t表示。 使用互斥變數以前,必須首先對它進行初始化,可以把它設定為常量PTHREAD_MUTEX_INITIALIZER(只適合用於靜態分配的互斥量), 也可以用pthread_mutexa

Java併發程式設計執行四種實現方式

Java實現多執行緒的方式 Java實現多執行緒的方式有4種: 繼承Thread方法、實現Runnable介面、實現Callable介面並通過FutureTask建立執行緒、使用ExecutorService。 其中,前兩種執行緒執行結果沒有返回值,後兩種是有返回值的。 1、繼承Th

Linux-C執行學習入門

下面兩個仁兄總結非常好。 主要學習一個例子: /* * test1.c * * Created on: 2016年7月26日 * Author: Andy_Cong

JAVA基礎複習執行和網路

1、建立執行緒和任務,如: //任務類必須實現Runnable介面 public class TaskClass implements Runnable{ ... public TaskClass(...){ ... } //想要在該執行緒執行的

Boost——執行

結合Boost官網 多執行緒的難點在於同步執行,需要“鎖”控制所有權。 鎖有分:互斥鎖,條件變數... 互斥鎖:boost::mutex 獲取和釋放成對存在,也可以用boost::lock_guard<boost::mutex> lock(mutex); boost::l

JAVA進階06執行

一、三個概念 1、程式 程式(Program)是一個靜態的概念,一般對應於作業系統中的一個可執行檔案 2、程序 (1)執行中的程式叫做程序(Process),是一個動態的概念 (2)特點: 程序是程式的一次動態執行過程, 佔用特定的地址空間 每個程序由3

Python高階程式設計執行

Python 多執行緒 多執行緒類似於同時執行多個不同程式,多執行緒執行有如下優點: 使用執行緒可以把佔據長時間的程式中的任務放到後臺去處理。 使用者介面可以更加吸引人,這樣比如使用者點選了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度 程式的執

執行基礎-執行併發安全問題

多執行緒基礎(三)-多執行緒併發安全問題 當多個執行緒併發操作同一資源時,由於執行緒切換實際不可控會導致操作邏輯執行順序出現混亂,嚴重時會導致系統癱瘓。例如下面的程式碼 public class SyncDemo { public static void main(Strin

執行說學逗唱:關於執行那不得不說的二三事

(二)多執行緒說學逗唱:新手村偶遇Thread類 為什麼一上來就要寫這個 這個是啥,那個那個是啥,直接進去主題不好嗎?以前我也是這麼想的,可是後來呀…總之,一個不刨根問底的程式設計師不是好程式設計師,要深究一個知識點還就得知道他是從哪裡來,到哪裡去,既然來到這個事件

執行說學逗唱:村口的老R頭是個掃地僧Runnable

(一)多執行緒說學逗唱:關於執行緒那不得不說的二三事 (二)多執行緒說學逗唱:新手村偶遇Thread類 上一篇我們講到Thread這個類以及簡單地說了下執行緒執行的隨機性,相信大家對執行緒的使用有了不小的瞭解… 繼承Thread介面是實現多執行緒

執行說學逗唱:執行險惡,變數和執行安全不得不防

(一)多執行緒說學逗唱:關於執行緒那不得不說的二三事 (二)多執行緒說學逗唱:新手村偶遇Thread類 (三)多執行緒說學逗唱:村口的老R頭是個掃地僧(Runnable) 出了新手村,以後的路可就不那麼好走了,到底現在也是個江湖人,都必須經歷點困難挫折,要不以後拿什

Java Socket應用執行實現客戶端的通訊

伺服器執行緒處理類ServerThread.java : package com.yijia; import java.io.*; import java.net.Socket; /** * 建立時間:2018/10/4 14:59 * 作者: * 郵箱:[ema

PyQt5進階——執行:QTimer

應用程式開發中多執行緒的必要性: 一般情況下,應用程式都是單執行緒執行的,但是對GUI程式來說,單執行緒有時候滿足不了要求,但是對於一些特殊情況:比如一個耗時較長的操作,執行過程會有卡頓讓使用者以為程式出錯而把程式關閉或是系統本身認為程式執行出錯而自動關閉程式。這個時候就

PyQt5進階——執行:QThread & 事件處理

接上篇… 2. QThread 要使用QThread開始一個執行緒,可以建立它的一個子類,然後覆蓋其QThread.run()函式 class Thread(QThread): def __init__(self): super().__init__()

MFC筆記——執行程式設計1:模組、程序、執行間的基本概念

一、模組、程序、執行緒 1.1 模組         一段可執行的程式(包括EXE和DLL),其程式程式碼、資料、資源被載入到記憶體中,由系統建立一個數據結構來管理它。這段程式就是一個模組。這裡所說

python高階——執行2執行UDP聊天器

import socket import threading def recv_msg(udp_socket): # 接收資料 while True: recv_data = udp_socket.recvfrom(1024) print(recv

執行3-執行訪問共享物件和資料的方式

在多執行緒(2)-ThreadLocal,我們討論了執行緒範圍內的資料共享,本篇文章我們討論執行緒之間即多執行緒訪問共享物件和資料的方式 一:Java5之前給共享資料加上鎖synchronized,上程式碼 public class MultiThreadShareDat

非同步程式設計學習之路-執行之間的協作與通訊

本文是非同步程式設計學習之路(三)-多執行緒之間的協作與通訊,若要關注前文,請點選傳送門: 非同步程式設計學習之路(二)-通過Synchronize實現執行緒安全的多執行緒 通過前文,我們學習到如何實現同步的多執行緒,但是在很多情況下,僅僅同步是不夠的,還需要執行緒與執行緒協作(通訊),生產

《Java執行程式設計核心技術》執行技能

最近閱讀了一本《Java多執行緒程式設計核心技術》,總結了一下每章的知識點: 第一章,java多執行緒技能 知識點: 1,實現多執行緒程式設計的方式主要有兩種:一是繼承Thread類,重新r

MFC筆記——執行程式設計3:用_beginthreadex()來代替使用CreateThread()

        CreateThread()函式是Windows提供的API介面,在C/C++語言另有一個建立執行緒的函式_beginthreadex(),在很多書上(包括《Windows核心程式設計》)提到過儘量使用_begin