Jungle 4 developer
Windows OS - CriticalSection Spinlock으로 사용하기
Windows OS - CriticalSection Spinlock으로 사용하기
2022.02.20EnterCriticalSection 시, 유저모드와 커널모드간 전환이 일어난다. 그런데 만약, 이미 다른 스레드가 공유자원을 가지고 있다는 판단에 커널모드로 전환되는 와중에, 공유자원이 접근 가능하게 되었다면 이는 큰 CPU 낭비로 이어질 수 있다. 때문에, CriticalSection 사용시 일정카운트동안은 스핀락처럼 공유자원 획득을 시도하도록 설정 할 수 있다. CRITICAL_SECTION CS; InitializeCriticalSection(&CS); SetCriticalSectionSpinCount(&CS, 4000); //4000 번 공유자원 획득을 시도하고, 이후에도 실패한다면, 커널모드로 제어를 전환한다.(블로킹 된다.)
Winsock/C++ 비동기 연결 요청 함수 ConnectEX
Winsock/C++ 비동기 연결 요청 함수 ConnectEX
2022.02.20SOCKET SOCK= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //상대 쪽에 고지할 IP와 포트를 설정. sockaddr_inMyAddress= { 0 , }; MyAddress.sin_addr.S_un.S_addr= ADDR_ANY; MyAddress.sin_family= AF_INET; MyAddress.sin_port= 0; bind(SOCK, (const sockaddr*)&MyAddress, sizeof(MyAddress)); //완료 통지를 받을 소켓을 IOCP에 등록한다. CreateIoCompletionPort(SOCK, hCompletionPort, (ULONG_PTR)SOCK, 0); //ConnectEx 함수 포인터를 얻어온다. GUID guid ..
Read/Write 스핀락 구현과 fairness에 대한 이야기
Read/Write 스핀락 구현과 fairness에 대한 이야기
2022.02.20class CSpinLockLatch { friend class CReadLockKey; friend class CWriteLockKey; public: constexpr static long WRITE_LOCK_MASK = 0x80000000; constexpr static long READ_LOCK_MASK = 0X7FFFFFFF; private: volatile long m_Flag = 0; public: CSpinLockLatch() {} virtual ~CSpinLockLatch() {} }; class CReadLockKey { private: volatile long* m_pLatchFlag = nullptr; public: CReadLockKey(CSpinLockLatch* Latch) {..
[BOJ] 2609 최대공약수와 최소공배수
[BOJ] 2609 최대공약수와 최소공배수
2022.02.07최대공약수는 유클리드 호제법을 이용해서 구한다. 최소공배수는 양쪽이 자신이 가진 약수중 상대가 가지지 않은 약수만을 남긴다음, 최대공약수와 모두 곱한 값이다. 예를 들어, X가 A * C 이고, Y가 B * C 이며, A와 B는 서로소라고 하자. X * Y 는 A * B * C * C 이다. #include int GetGCD(int A, int B) { int Bigger = A > B ? A : B; int Smaller = A > B ? B : A; int Remainder = Bigger % Smaller; if (0 == Remainder) return Smaller; return GetGCD(Smaller, Remainder); } int main() { std::cin.tie(0); std:..
[BOJ] 1037 약수 - 정수론
[BOJ] 1037 약수 - 정수론
2022.02.07어떠한 수의 가장 큰 약수와 가장 작은 약수를 곱한값 이다. 어떠한 수 N이 A * B * C 일때, 약수는 다음과 같다. 1과 N을 제외한 약수는 다음과 같다. A, B, C, A * B, A * C, B * C 가장 작은 약수가 A라고 하자. 그러면 가장 큰 약수는 당연히 가장 작은 약수를 제외한 것을 모두 곱한 B * C이다. 문제에서 모든 약수를 준다. 따라서, 배열을 정렬 한 다음 가장 큰 수와 가장 작은 수를 곱해주면 된다. #include #include #include int N; int main() { std::cin.tie(0); std::cout.tie(0); std::cin.sync_with_stdio(false); std::cout.sync_with_stdio(false); std..