1. 程式人生 > >windows執行緒間通訊之:訊號量

windows執行緒間通訊之:訊號量

可以描述一個資源有多少。

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <process.h>

using namespace std;
CRITICAL_SECTION cs;

typedef struct{
    HANDLE h1;
    HANDLE h2;
    HANDLE h3;
    HANDLE h4;
    int a;
}PARAMS, *PPARAMS;

void read1(PVOID pvoid){
    while(TRUE)
    {
        volatile PPARAMS pparams = (PPARAMS)pvoid;

        WaitForSingleObject(pparams->h2, INFINITE);
        EnterCriticalSection(&cs); // 臨界區(程式碼塊鎖,只能有一個執行緒訪問)
        cout<<"讀執行緒1開始讀取...\n";
        cout<<(pparams->a)<<endl;
        LeaveCriticalSection(&cs);
        Sleep(1000);
        ReleaseSemaphore(pparams->h1, 1, NULL); // 寫訊號量++

    }
}
void read2(PVOID pvoid){
    while(TRUE)
    {
        volatile PPARAMS pparams = (PPARAMS)pvoid;
        WaitForSingleObject(pparams->h3, INFINITE);
        EnterCriticalSection(&cs); // 臨界區(程式碼塊鎖,只能有一個執行緒訪問)
        cout<<"讀執行緒2開始讀取...\n";
        cout<<(pparams->a)<<endl;

        LeaveCriticalSection(&cs);
        Sleep(1000);
        ReleaseSemaphore(pparams->h1, 1, NULL); // 寫訊號量++
    }
}
void read3(PVOID pvoid){
    while(TRUE)
    {
        volatile PPARAMS pparams = (PPARAMS)pvoid;
        WaitForSingleObject(pparams->h4, INFINITE);
        EnterCriticalSection(&cs); // 臨界區(程式碼塊鎖,只能有一個執行緒訪問)
        cout<<"讀執行緒3開始讀取...\n";
        cout<<(pparams->a)<<endl;
        LeaveCriticalSection(&cs);
        Sleep(1000);
        ReleaseSemaphore(pparams->h1, 1, NULL); // 寫訊號量++
    }
}

void write(PVOID pvoid){
    while(TRUE)
    {
        volatile PPARAMS pparams = (PPARAMS)pvoid;
        // 只有寫訊號量有3個的時候才能走完這3個wait函式
        WaitForSingleObject(pparams->h1, INFINITE);
        WaitForSingleObject(pparams->h1, INFINITE);
        WaitForSingleObject(pparams->h1, INFINITE);
        cout << "=================\n";
        cout << "寫執行緒開始寫入...\n";
        pparams->a = rand() % 256;
        cout << "寫入"<< (pparams->a) <<endl;
        ReleaseSemaphore(pparams->h2, 1, NULL); // 讀訊號量++
        ReleaseSemaphore(pparams->h3, 1, NULL); // 讀訊號量++
        ReleaseSemaphore(pparams->h4, 1, NULL); // 讀訊號量++
    }
}
int main()
{
    PARAMS params;
    params.h1 = CreateSemaphore(NULL,
                                3,  // 剛開始有多少訊號量
                                3,  // 最多可以有多少訊號量
                                NULL); // 訊號量名稱

    params.h2 = CreateSemaphore(NULL, 0, 1, NULL);
    params.h3 = CreateSemaphore(NULL, 0, 1, NULL);
    params.h4 = CreateSemaphore(NULL, 0, 1, NULL);

    InitializeCriticalSection(&cs); // 初始化臨界區
    _beginthread(read1, 0, &params);
    _beginthread(read2, 0, &params);
    _beginthread(read3, 0, &params);
    _beginthread(write, 0, &params);

    int a;
    cin >> a; // 主執行緒阻塞用
    DeleteCriticalSection(&cs); // 釋放臨界區
    return 0;
}

相關推薦

windows執行通訊訊號

可以描述一個資源有多少。#include "stdafx.h"#include <windows.h>#include <iostream>#include <process.h>using namespace std;CRITICAL_

windows執行通訊事件

// CreatEventDemo.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "iostream" #include <windows.h> using na

程序通訊systemV訊號(semget semop semctl相關操作)

一、什麼是訊號量? 訊號量的本質就是計數器,記錄臨界資源的數目,用來協助程序同步互斥的訪問臨界資源。為什麼不在程序中定義一個全域性變數作為計數器呢?兩個程序間的地址空間是各自獨立的,各自有各自的虛擬記憶體空間。多程序之間不能看到各自程序中的全域性變數。(程序間的虛擬記憶體h

【Java併發程式設計】使用wait/notify/notifyAll實現執行通訊的幾點重要說明

在Java中,可以通過配合呼叫Object物件的wait()方法和notify()方法或notifyAll()方法來實現執行緒間的通訊。線上程中呼叫wait()方法,將阻塞等待其他執行緒的通知(其

python多執行————3、多執行通訊共享變數,queue

1、共享變數 #通過共享變數 import time import threading url_list = [] def get_detail_html(): global url_list while True: if len(url_list):

Java多執行學習筆記15執行通訊

詳細程式碼見:github程式碼地址   本節內容: 1)ThreadLocal類的使用     JDK文件及方法翻譯     InheritableThreadLocal的使用   5.

Java多執行學習筆記14執行通訊

詳細程式碼見:github程式碼地址   本節內容: 1) 實戰 等待/通知之交叉備份 2) 方法join的使用(Jdk文件翻譯及原始碼解析)     join()及join(long)的使用和實現原理   &nbs

Java多執行學習筆記13執行通訊

詳細程式碼見:github程式碼地址   本節內容: 1)  生產者消費者模型     多個生產者和多個消費者: 操作值假死及解決     多個生產者和多個消費者: 操作棧假死及解決 2) 通過管

android進階3step2Android App通訊——Android執行通訊

Android進階:網路與資料儲存—步驟1:Android網路與通訊(第2小節:Handler) https://blog.csdn.net/qq_17846019/article/details/82906216 Android進階:網路與資料儲存—步驟1:Android網路與通訊(第3小

執行通訊與協作方式——wait-notify機制

大家好,上篇文章為大家介紹了執行緒間通訊和協作的一些基本方式,那這篇文章就來介紹一下經典的wait-notify機制吧。 什麼是wait-notify機制? 想象一下有兩個執行緒A、B,如果業務場景中需要這兩個執行緒交替執行任務(比如A執行完一次任務後換B執行,B執行

Java多執行學習筆記11執行通訊

本文是我學習Java多執行緒以及高併發知識的第一本書的學習筆記, 書名是<<Java多執行緒程式設計核心技術>>,作者是大佬企業高階專案經理 高洪巖前輩,在此向他致敬。我將配合開發文件以及本書和其他的部落格 奉獻著的文章來學習,同時做一些簡單的總結。有

第三章執行通訊

一句話總結wait和notify: wait使執行緒停止執行, 而notify使停止的執行緒繼續執行。 wait()執行後,執行緒進入等待執行緒佇列,釋放鎖。notify()執行後,並不立即釋放鎖,後面語句要執行完才釋放。 關鍵字synchronized

Java 併發執行通訊與協作

摘要:   執行緒與執行緒之間不是相互獨立的個體,它們彼此之間需要相互通訊和協作,最典型的例子就是生產者-消費者問題。本文首先介紹 wait/notify 機制,並對實現該機制的兩種方式——synchronized+wait-notify模式和Lock+Con

執行通訊_等待/通知Thread.join()

Thread.join原始碼:public final synchronized void join(long millis) throws InterruptedException {

Android訊息機制原理,仿寫Handler Looper原始碼跨執行通訊原理--執行通訊原理(一)

前言:我們都知道Android的執行緒通訊是用Handler、Looper機制實現的,面試也經常問道,網上也有很多文章介紹原始碼但是可能很多小白只是機械是的記憶,回答不清楚原理究竟是怎麼回事。下邊我將一步一步仿寫一個Handler、Looper模擬Android的執行緒間通訊

五、JAVA多執行執行通訊(wait、notify、notifyAll、wait set、自定義鎖 BooleanLock )

       我們在開發多執行緒程式的時候,往往不會只存在一個獨立的執行緒,相反大多數情況下是需要多個執行緒之間進行協同工作的,如何在多個執行緒之間進行通訊,是本章學習的重點。另外,本章的最後部分將會分析synchronized關鍵字的缺陷,我們手動實現了一個

Android基礎學習程序執行通訊方式總結

        首先介紹一下程序和執行緒的基本概念及兩者之間的區別:   程序:是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。   執行緒:是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本

程序通訊機制(管道、訊號、共享記憶體/訊號/訊息佇列)、執行通訊機制(互斥鎖、條件變數、posix匿名訊號

(1)系統中每個訊號量的資料結構(sem)struct sem {     int semval; /* 訊號量的當前值 */     unsigned short  semzcnt;  /* # waiting for zero */     unsigned short  semncnt;  /* # w

windows C++程序執行通訊

程序間通訊 程序基本概念 In computer science, inter-process communication or interprocess communication (IPC) refers specifically to the

Java執行通訊訊號

1. 訊號量Semaphore 先說說Semaphore,Semaphore可以控制某個資源可被同時訪問的個數,通過 acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。一般用於控制併發執行緒數,及執行緒間互斥。另外重