1. 程式人生 > >多執行緒中執行緒鎖的使用

多執行緒中執行緒鎖的使用

在多執行緒的程式編寫中,常常遇到共享資源使用衝突解決的苦惱。終於看到並測試了一種簡單方法。

執行緒鎖的5個要素:

CRITICAL_SECTION g_cs;  //定義執行緒鎖

InitializeCriticalSection(&g_cs);    //初始化

DeleteCriticalSection(&g_cs);    //刪除

EnterCriticalSection(&g_cs);    //加鎖

LeaveCriticalSection(&g_cs);    //釋放鎖

下面是測試程式locktest.cpp:

#include <iostream>

#include <windows.h>

using namespace std;

CRITICAL_SECTION g_cs;

DWORD WINAPI fThread1(LPVOID lpParameter)

{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
  EnterCriticalSection(&g_cs);
   
  cout<<"fThread1 ----: "<<i<<"  "<<j<<endl;
  LeaveCriticalSection(&g_cs);
  Sleep(1);
}
}
 return 0;
}


DWORD WINAPI fThread2(LPVOID lpParameter)
{
int i,j;
for(i=0;i<3;i++)
{
EnterCriticalSection(&g_cs);
for(j=0;j<3;j++)
{
  //EnterCriticalSection(&g_cs);
   
  cout<<"fThread2 ****: "<<i<<"  "<<j<<endl;
  //LeaveCriticalSection(&g_cs);
  Sleep(1);
}
LeaveCriticalSection(&g_cs);
Sleep(1);
}
 return 0;
}


int main()
{
 HANDLE hThread1;
 HANDLE hThread2;


  cout<<"init: "<<endl;
 InitializeCriticalSection(&g_cs);


 hThread1 = CreateThread(NULL,0,fThread1,NULL,0,NULL);
 hThread2 = CreateThread(NULL,0,fThread2,NULL,0,NULL);
 CloseHandle(hThread1);
 CloseHandle(hThread2);


 Sleep(4000);
 DeleteCriticalSection(&g_cs);
 return 0;

}

執行結果顯示:

這個執行結果說明鎖定區間內,其他程式不能打擾,搶佔資源。

執行緒1加鎖在內迴圈,每次鎖定一行顯示,而執行緒2加鎖在for(j=...) 外圍,所以每次鎖定3行顯示。執行緒2結束後,資源就全是執行緒1的了。

為了對比,修改執行緒2 加鎖的位置,也到最內迴圈,結果如下:


可以看到,執行緒顯示是交替的。執行緒1顯示1行,執行緒2顯示1行,直到結束。

相關推薦

java執行顯式的輪詢檢測策略

顯式鎖簡介 java5.0之前,在協調對共享物件的訪問時可以使用的機制只有synchronized和volatile,java5.0增加了一種新的機制:ReentrantLock。 鎖像synchronized同步塊一樣,是一種執行緒同步機制,與synchronized不同的是ReentrantLock提

執行遞迴的實現.

*引用本文請註明來自 blog.csdn.net/wtz1985        在上一篇文章中,我已經闡述了多執行緒中簡單鎖的實現,可在結束的時候,我就提了那麼一個問題,那就是如果在一個連結串列中進行插入時,要進行查詢的操作,如果只是簡單的鎖,是沒法實現的。所以“遞迴鎖”就

執行執行的使用

在多執行緒的程式編寫中,常常遇到共享資源使用衝突解決的苦惱。終於看到並測試了一種簡單方法。執行緒鎖的5個要素:CRITICAL_SECTION g_cs;  //定義執行緒鎖InitializeCrit

執行執行的同步synchronized

當多個執行緒同時執行時,由於cpu是隨機分片的,所以,一個執行緒在執行過程中被另一個執行緒打斷的情況是經常發生的。 這在某些情況下是會影響到正常的程式的輸出結果的。比如銀行轉賬一個人的賬戶在轉賬時是不能

執行的LOCK

Lock是一個介面 void lock();獲取鎖 void unlock();釋放鎖 ReentrantLock是Lock的實現類. 等待喚醒: Object類中提供了三個方法: wait();等待 notify(

執行觸發的事件函式在哪個執行執行

轉載於:https://www.cnblogs.com/findumars/p/5289375.html  在多執行緒開發中,如果在多執行緒中訪問主執行緒建立的物件,並觸發了這個物件的事件,將會執行這個事件的處理函式,那麼這個處理函式是在主執行緒中執行還是在觸發事件的執行

Android執行執行“getevent”命令時的執行退出(結束)問題

       專案中遇到需要執行shell命令“getevent”獲取座標引數的需求,但是發現無法結束執行該命令的執行緒,後來終於發現解決方法。在此記錄下。        我線上程中通過Process

handle.post 跳到主執行執行

package com.example.che; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.widget.T

用Handler的post()方法來傳遞執行的程式碼段到主執行執行

package com.kale.handler; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android

java線程的死情況讀書筆記

bubuko 實例 syn 釋放 splay inf info sys 資源 多線程中的死鎖 在前面的分析中,我們知道一個對象可以用Synchronized方法或者其他的加鎖形式來防止別的任務在互斥還沒有釋放的時候就訪問這個對象。 試想一下這樣的情況:某個任務在等待另一個任

Java執行程式設計執行的同步與互斥/執行安全/Java

摘要:多執行緒三個特徵:原子性、可見性以及有序性.&gt;執行緒的同步與互斥?(同步執行緒與非同步執行緒,執行緒同步和非同步問題)&nbsp;&nbsp;1.同步:假設現有執行緒A和執行緒B,執行緒A需要往緩衝區寫資料,執行緒B需要從緩衝區讀資料,但他們之間存在一種制約

執行

樂觀鎖和悲觀鎖 樂觀鎖和悲觀鎖是在資料庫中引入的名詞,但是在併發包鎖裡面也引入了類似的思想,所以這裡還是有必要講解一下。 悲觀鎖指對資料被外界修改持保守的態度,認為資料很容易就會被其他執行緒修改,所以在資料被處理前就先對資料加鎖,並在整個資料處理過程中,使資料處於鎖定狀態,悲觀鎖的實現往往依靠資料庫

【面試題】執行執行過程,某個執行執行時,突然釋放。會發生的特殊狀態

一,背景 今天在刷面試題的時候,做到一道面試題,雖然看了答案,但有一個答案還是不理解。後來研究了一下,得到結論:執行緒拿到鎖進行執行時,哪怕獲得了CPU執行權,但是那個鎖不能丟失,它後面執行的過程都需要帶著鎖,才能往下繼續執行。 二,測試程式碼 /**

執行的使用

執行緒之間的鎖有:互斥鎖、條件鎖、自旋鎖、讀寫鎖、遞迴鎖。一般而言,鎖的功能越強大,效能就會越低。 1、互斥鎖 互斥鎖用於控制多個執行緒對他們之間共享資源互斥訪問的一個訊號量。也就是說是為了避免多個執行緒在某一時刻同時操作一個共享資源。例如執行緒池中的有多個空閒執行緒和一個任務佇列。任

iOS 執行

鎖的分類以及簡單介紹 一. 鎖的分類 互斥鎖 互斥鎖是一種訊號量,一次只允許訪問一個執行緒。如果正在使用互斥鎖並且另一個執行緒試圖獲取它,則該執行緒將阻塞,直到互斥鎖被其原始持有者釋放。如果多個執行緒競爭相同的互斥鎖,則一次只允許一個互斥鎖訪問它。 遞迴鎖定(也是互

執行系統(一)-基礎用法

     平常在多執行緒開發中,總避免不了執行緒同步。本篇對net多執行緒中的鎖系統做個簡單描述。 閱讀目錄: lock、Monitor Lock是Monitor語法糖簡化寫法,Lock在IL會生成Monitor。 //======Example 1=====

執行的wait與sleep到底誰釋放了

首先,多執行緒中會使用到兩個延遲的函式,wait和sleep。 wait是Object類中的方法,而sleep是Thread類中的方法。 sleep是Thread類中的靜態方法。無論是在a執行緒中呼

java執行的sleep()、wait()、notify()和物件的關係

1、sleep()不釋放物件鎖。 2、wait()釋放物件鎖。 3、notify()不釋放物件鎖。 (1)、notify釋放鎖嗎?不要誤導別人。notifty()只是喚醒此物件監視器上等待的單個執行緒,直到當前執行緒釋放此物件上的鎖,才有可能繼續執行被喚醒的執行緒。 (2)

c語言資料結構應用-陣列佇列(無佇列)在執行的使用

一、背景 上篇文章《c語言資料結構實現-陣列佇列/環形佇列》講述了陣列佇列的原理與實現,本文編寫一個雙執行緒進行速度測試 二、相關知識 多執行緒程式設計介面: 1) 建立執行緒 pthread_create 函式 SYNOPSIS #include <

執行 關於條件變數和互斥的疑惑(純乾貨)

條件變數的執行過程(虛擬碼) int pthread_cond_wait(&cond,&wait) { int ret = pthread_cond_wait_and unlock(&cond,&wait);//進入