일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- JUCE library
- BOJ
- 운영체제
- JUCE
- C++ gui
- 프로그래밍
- go
- 알고리즘
- LOB
- go channel
- JUCE라이브러리
- 코딩
- 리듬게임
- vim-go
- a tour of go
- tour of go
- Nebula
- C++ gui 라이브러리
- C언어
- c++ heap
- 백준
- C++ library
- 공룡책
- Docker
- gui
- OS
- 자료구조
- 연결리스트
- JUCE 튜토리얼
- C++
- Today
- Total
CafeM0ca
[C++] std::call_once, std::once_flag 본문
std::call_once는 callable을 등록할 수 있다.
std::once_flag는 하나의 등록된 함수만이 호출될 수 있음을 보장한다.
둘 다 <mutex>에 있다.
std::call_once
- 오직 하나의 함수가 한 번만 수행됨. 어느 함수가 선택될지는 정의되지 않음. 선택된 함수는 std::call_once 호출과 동일한 스레드에서 실행
- 성공적으로 완료되기 전까지 어떤 호출도 리턴되지 않음.
- 예외로 종료시 caller에게 전파. 이에 따라 새로운 함수가 선택되고 실행됨.
#include <iostream>
#include <thread>
#include <mutex>
std::once_flag onceFlag;
void do_once() {
std::call_once(onceFlag, []() { std::cout << "Only once." << std::endl; });
}
int main()
{
std::cout << std::endl;
std::thread t1(do_once);
std::thread t2(do_once);
std::thread t3(do_once);
std::thread t4(do_once);
t1.join();
t2.join();
t3.join();
t4.join();
return 0;
}
실행 결과
Only once.
분명 do_once함수가 4개의 쓰레드에 의하여 4번 호출되어야하는데 단 한번만 실행되었다.
이것을 singleton에 적용하면 하나의 instance가 생성됨을 보장할 수 있다.
/*
class MySingleton {
private:
static once_flag initInstanceFlag;
static MySingleton* instance;
MySingleton() = default;
~MySingleton() = default;
public:
MySingleton(const MySingleton&) = delete;
MySingleton& operator=(const MySingleton&) = delete;
static MySingleton* getInstance() {
call_once(initInstanceFlag, MySingleton::initSingleton);
return instance;
}
static void initSingleton() {
instance = new MySingleton();
}
};
*/
'Programming > C++' 카테고리의 다른 글
[EOS] eosio.cdt build sys error (0) | 2018.10.12 |
---|---|
[C++11] 조건변수 (0) | 2018.09.16 |
[C++] explicit (0) | 2018.07.23 |
[C++] Rule of Three, Rule of Five, Rule of Zero (0) | 2018.07.22 |
[JUCE] 맵 컴포넌트가 안보이는데? (컴포넌트 레이아웃 배치순서) (0) | 2018.07.16 |