C++11 동시 다발 지침 std::mutex 상세 설명
8076 단어 C++11std::mutex
Mutex 는 상호 배척 량 이 라 고도 부 릅 니 다.C+11 에서 Mutex 와 관련 된 클래스(잠 금 형식 포함)와 함 수 는 모두
Mutex 시리즈 클래스(4 가지)
다음은 std::mutex 를 예 로 들 어 C+11 의 상호 배척 용법 을 소개 합 니 다.
std::mutex 는 C++11 에서 가장 기본 적 인 상호 배척 량 입 니 다.std:mutex 대상 은 독점 소유권 의 특성 을 제공 합 니 다.즉,재 귀적 으로 std::mutex 대상 에 잠 그 는 것 을 지원 하지 않 습 니 다.std::recursivelock 은 상호 배척 대상 을 재 귀적 으로 잠 글 수 있 습 니 다.
std::mutex 의 구성원 함수
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex
volatile int counter(0); // non-atomic counter
std::mutex mtx; // locks access to counter
void attempt_10k_increases() {
for (int i=0; i<10000; ++i) {
if (mtx.try_lock()) { // only increase if currently not locked:
++counter;
mtx.unlock();
}
}
}
int main (int argc, const char* argv[]) {
std::thread threads[10];
for (int i=0; i<10; ++i)
threads[i] = std::thread(attempt_10k_increases);
for (auto& th : threads) th.join();
std::cout << counter << " successful increases of the counter.
";
return 0;
}
std::recursive_mutex 소개std::recursive_mutex 는 std::mutex 와 마찬가지 로 잠 길 수 있 는 대상 이지 만 std::mutex 와 달리 std::recursivemutex 는 같은 스 레 드 가 상호 배척 량 에 대해 여러 번 잠 금(즉,재 귀 잠 금)을 허용 하여 상호 배척 대상 에 대한 다 층 소유권 을 얻 을 수 있 습 니 다.std::recursivemutex 가 상호 배척 량 을 방출 할 때 이 자물쇠 의 깊이 와 같은 횟수 의 unlock()을 호출 해 야 합 니 다.lock()횟수 와 unlock()횟수 가 같 습 니 다.그 밖 에 std::recursivemutex 의 특성 은 std::mutex 와 대체적으로 같 습 니 다.
std::time_mutex 소개
std::time_mutex 는 std::mutex 보다 두 개의 구성원 함수 가 많 습 니 다.trylock_for(),try_lock_until()。
try_lock_for 함수 가 시간 범 위 를 받 아들 이 는 것 은 이 시간 범위 내 에서 스 레 드 가 자 물 쇠 를 얻 지 못 하면 막 히 는 것 을 나타 낸다(std:mutex 의 trylock()다르다,trylock 이 호출 되 었 을 때 자 물 쇠 를 얻 지 못 하면 false 로 돌아 갑 니 다.이 기간 에 다른 스 레 드 가 자 물 쇠 를 풀 었 다 면 이 스 레 드 는 서로 배척 하 는 자 물 쇠 를 얻 을 수 있 습 니 다.시간 이 초과 되 었 을 때(즉,지정 한 시간 내 에 자 물 쇠 를 얻 지 못 했 을 때)false 로 돌아 갑 니 다.
try_lock_until 함 수 는 하나의 시간 점 을 매개 변수 로 받 아들 입 니 다.지정 한 시간 점 이 오기 전에 스 레 드 가 자 물 쇠 를 얻 지 못 하면 막 힙 니 다.이 기간 에 다른 스 레 드 가 자 물 쇠 를 풀 면 이 스 레 드 는 상호 배척 량 에 대한 자 물 쇠 를 얻 을 수 있 습 니 다.시간 이 초과 되면(즉,지정 한 시간 내 에 자 물 쇠 를 얻 지 못 했 습 니 다)false 로 돌아 갑 니 다.
아래 의 작은 예 는 std::time 를 설명 합 니 다.mutex 의 용법(레 퍼 런 스).
#include <iostream> // std::cout
#include <chrono> // std::chrono::milliseconds
#include <thread> // std::thread
#include <mutex> // std::timed_mutex
std::timed_mutex mtx;
void fireworks() {
// waiting to get a lock: each thread prints "-" every 200ms:
while (!mtx.try_lock_for(std::chrono::milliseconds(200))) {
std::cout << "-";
}
// got a lock! - wait for 1s, then this thread prints "*"
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
std::cout << "*
";
mtx.unlock();
}
int main ()
{
std::thread threads[10];
// spawn 10 threads:
for (int i=0; i<10; ++i)
threads[i] = std::thread(fireworks);
for (auto& th : threads) th.join();
return 0;
}
std::recursive_timed_mutex 소개std:recursivemutex 는 std::mutex 와 의 관계 가 같 습 니 다.std::recursivetimed_mutex 의 특성 도 std::timedmutex 유도,관심 있 는 신발 은 스스로 찾 아 볼 수 있 습 니 다.;-)
std::lock_guard 소개
Mutex RAII 와 관련 하여 스 레 드 가 상호 배척 량 에 잠 그 는 것 을 편리 하 게 합 니 다.예(레 퍼 런 스):
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex, std::lock_guard
#include <stdexcept> // std::logic_error
std::mutex mtx;
void print_even (int x) {
if (x%2==0) std::cout << x << " is even
";
else throw (std::logic_error("not even"));
}
void print_thread_id (int id) {
try {
// using a local lock_guard to lock mtx guarantees unlocking on destruction / exception:
std::lock_guard<std::mutex> lck (mtx);
print_even(id);
}
catch (std::logic_error&) {
std::cout << "[exception caught]
";
}
}
int main ()
{
std::thread threads[10];
// spawn 10 threads:
for (int i=0; i<10; ++i)
threads[i] = std::thread(print_thread_id,i+1);
for (auto& th : threads) th.join();
return 0;
}
std::unique_lock 소개Mutex RAII 와 관련 하여 스 레 드 가 상호 배척 량 에 잠 그 는 것 을 편리 하 게 하지만 더 좋 은 잠 금 해제 와 잠 금 제 어 를 제공 합 니 다.예(레 퍼 런 스):
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex, std::unique_lock
std::mutex mtx; // mutex for critical section
void print_block (int n, char c) {
// critical section (exclusive access to std::cout signaled by lifetime of lck):
std::unique_lock<std::mutex> lck (mtx);
for (int i=0; i<n; ++i) {
std::cout << c;
}
std::cout << '
';
}
int main ()
{
std::thread th1 (print_block,50,'*');
std::thread th2 (print_block,50,'$');
th1.join();
th2.join();
return 0;
}
자,본문 은 잠시 여기까지 이야기 하고 std::try 남 았 습 니 다.lock,std::lock,std::call_once 세 함수 가 언급 되 지 않 았 으 니 다음 블 로그 에 남 겨 두 고 이야기 하 세 요.-)이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
어디서나 먹을 수있는 C++ 소프트웨어 엔지니어가되기 위해아래의 책은 숙독하자. 테스트 리팩토링, 좋은 설계란 무엇인가를 배울 수 있습니다. 임베디드 분야의 예를 사용하고 있습니다만, 임베디드를 하지 않는 사람이라도 도움이 되는 내용입니다. C/C++ 언어의 어려운 점은 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.