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, ¶ms);
_beginthread(read2, 0, ¶ms);
_beginthread(read3, 0, ¶ms);
_beginthread(write, 0, ¶ms);
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進階3step2:Android 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() 釋放一個許可。一般用於控制併發執行緒數,及執行緒間互斥。另外重