분류 전체보기
Deadlock 데드락
Deadlock 데드락
2018.10.04데드락은 프로세스2개 자원2개만 기억하면 된다. 데드락에는 프로세스2개 자원2개가 필요하니 데드락 케이스를 만들어 낼 때, 프로세스2개 자원2개만 기억하면 만들어 낼 수 있다. 교착 상태 조건 4가지 다음 4가지 조건을 모두 만족하면 데드락이 발생한다. Mutual Exclusion : 상호 배제. 프로세스가 타겟 자원을 요구 시 타 프로세스를 배제하고 배타적으로 요구한다. (자원을 혼자 쓰겠다.) Hold & Wait : 자원 하나 홀드 한 상태에서, 다른 자원이 반환되기를 기다린다. No Preemption : 비선점. 다른 프로세스가 가지고 있는 자원을 선점할 수 없다.[=뺏어올 수 없다] (반대 케이스는 내가 우선순위가 높으면 선점 가능한 경우.) Circular Wait : 대기가 환형으로 발생..
Dynamic programming, 기억하며 풀기
Dynamic programming, 기억하며 풀기
2018.09.26DP를 번역하면 동적 계획법 이지만 책 "컴퓨터 과학이 여는 세계"에서는 다이나믹 프로그래밍을 본질적인 의미를 더 살려서 기억하며 풀기로 더욱 적절하게 번역하였다. 즉, 이전에 구한 작은 부분 문제의 답을, 다음 문제를 푸는데 이용하는 문제 해결 방식. 이전 답을 재활용하면서 더 큰 문제를 해결하는 방식이다. 피보나치 수열 구하기(그냥 일반항에 대입하면 나오기는 하지만) 처럼 최종 결과를 도출하기 위해서 이를 더 작은 단위의 문제로 나눠서 먼저 해결하고 그것을 조합하여 최종 문제를 해결하는 방법을 말한다. * 분할 정복과 비슷하나, 분할 정복은 분할된 문제가 서로 영향을 주지 않아 독립적으로 해결 가능하다는 차이점이 있다. 진행 방식에 따라 Top-down(Memoization)과 Bottom-up으로 ..
[C++] 다양한 mutex, lock 중 뭘 써야하나.
[C++] 다양한 mutex, lock 중 뭘 써야하나.
2018.09.13그냥 락 거는 것 보다, 다음 API들을 사용하는게 좋다. 스코프를 벗어나면 자동으로 해제되는 lock을 걸기 위해서는 (since C++ 17 || boost)```cpp#include std::mutex mutex1;std::mutex mutex2;std::scoped_lock lock(mutex1, mutex2);// lock.unlock();```이는 ``cpp std::lock_guard``에 여러 mutex들을 한번에 lock할 수 있는 기능을 추가한 완전한 상위 호환 API다. mutex 하나 넘길 때도 퍼포먼스 걱정 안해도 된다고 함. 다양한 기능을 지원하는 unique_lockhttps://github.com/CppKorea/CppConcurrencyInAction/wiki/Chapter..
[C++] 생성자에서 throw하면(exception) 객체가 없어질까? / thread는 start() 함수로?
[C++] 생성자에서 throw하면(exception) 객체가 없어질까? / thread는 start() 함수로?
2018.09.12결론부터 말하자면 없어진다.함수들이 전후 호출 순서 종속성이 생기는 경우 생성자에서 처리하는게 깔끔하다. 생성자에서 처리 안하고 ``c f1()`` 호출하고 ``c f2()`` 호출하는 식이면, 이 호출 순서를 강제할 수 없으니 ``c f2()``에서 내부에 종속성 변수가 ``c NULL``인지와 같이 잘 초기화되었는지 체크해주는 루틴이 들어가 줘야 한다. 생성자는 리턴이 안되니 exception 처리가 애매한 부분이 있었으나 throw하면 없어진다고 하니 그냥 생성자에서 초기화해주는게 좋을 것 같다. https://kldp.org/node/48121 C++ Standard 15.2Quote:An object that is partially constructed or partially destroyed ..
[C++] thread는 context가 필요하다.
[C++] thread는 context가 필요하다.
2018.09.11전역 함수를 threadMain으로 지정해 실행하는건 그냥 다른 언어 처럼 하면 되는데, 객체의 메서드를 threadMain으로 지정하는건 몇 가지 신경써야 할 부분이 있다.보통 다른 언어 같으면, `` Thread`` 클래스 상속받아서 ``c t.run()`` 해주면 끝인데, C++은 그렇지 못하다. 구식 방법원래 클래스 내부의 메서드를 threadMain으로 지정하기 위해서는, threadMain가 될 메서드를 static으로 빼고,static 메서드는 클래스 내부의 일반 멤버에 접근하지 못하기 때문에 일반 메서드의 wrapper처럼 사용하고, 진짜 _threadMain은 일반 메서드로 구성한 다음, 그 일반 메서드를 호출하기 위해threadMain 메서드에서 ``c void*`` 형을 인자로 받은 ..
[C++] lambda (bind 보다는 lambda를 쓰자)
[C++] lambda (bind 보다는 lambda를 쓰자)
2018.09.03lambda가 왜 필요하냐면,함수 포인터는 함수이기 때문에 상태를 가질 수 없다.반복문 같은데 인자로 함수를 넘겨야 하는 상황에서 그 함수가 상태를 가져야 하는 경우, 함수 포인터를 사용할 수 없다.따라서 상태를 가지는 함수를 만들기 위해서 함수 객체라는 트릭을 사용해야 했다.함수 객체는 객체인데, ``cpp operator()``를 오버로드해서 함수처럼 호출할 수 있는 객체를 의미한다. Function object는 보통 Functor라고 부른다.```cppstruct Functor { void operator()() { std::cout
[C++] 컨테이너 안에 클래스가 들어있을 때, 클래스 안의 멤버들을 순회하는 이터레이터를 반환받는 방법 + mem_fn
[C++] 컨테이너 안에 클래스가 들어있을 때, 클래스 안의 멤버들을 순회하는 이터레이터를 반환받는 방법 + mem_fn
2018.09.03``cpp vector``가 있을 때, `` cls.value``들만 뽑아내고 싶은 경우가 빈번하게 있다.일반적인 경우 그냥 반복문 돌면서 처리해주면 되지만,라이브러리 등을 사용할 때는 반드시 `` cls.value``로 이루어진 iterator를 넘겨야만 하는 경우가 있다. 이런 경우 처음으로 드는 생각은 함수형의 ``cpp filter()``인데, 이는 copy가 발생하게 된다.copy 없이 `` cls`` 내의 멤버인 `` cls.value``들만 순회하는 iterator는 다음과 같은 방식으로 만들 수 있다. boost::transform_iterator내부적으로 정확히 어떻게 동작하는건지는 찾아보지 않았지만, 첫 번째 인자로 지정된 iterable의 원소를 하나 씩 꺼내서 두 번째 인자로 지정된..
[C/C++] strncpy()는 NULL문자를 넣어주지 않는다.
[C/C++] strncpy()는 NULL문자를 넣어주지 않는다.
2018.08.21```cint main() { int size = 4; char buf[size] = {'*', '*', '*', '*'}; strncpy(buf, "asd", size - 1); // buf[size - 1] = '\0'; printf("%s\n", buf); return 0;}``````asd*�FUUUU```따라서 명시적으로 ``c '\0'``을 넣어주어야 한다.쓰려는 src문자열의 길이가, 명시된 `` n``보다 작은 경우는 NULL문자를 넣어주지만, src문자열의 길이가 `` n``과 같거나 큰 경우 `` n``까지만 쓰고 그냥 그만두기 때문에, 명시적으로 넣어주는 것이 좋다.
[C++] \r이 포함된 문자열 출력할 때 이상하게 출력되는 현상
[C++] \r이 포함된 문자열 출력할 때 이상하게 출력되는 현상
2018.08.21```cpp#include #include using namespace std; int main() { string item = "abc\r\ndef\nghi"; // contain \r istringstream stream(item); while (getline(stream, item)) { cout
[C++] 맵 : unordered_map (hash_map)
[C++] 맵 : unordered_map (hash_map)
2018.08.20find와 count로 exist 체크내부에 해당 key가 존재하는지는 ``c count()/find()``를 사용한다.중복을 허용하지 않는 자료구조에서 둘은 내부적으로 거의 똑같기 때문에, 취향 대로 사용하면 된다.```cpp#include #include std::unordered_map hash_map;int main() { hash_map.insert(std::make_pair("umbum", 1234)); // hash_map["umbum"] = 1234 도 가능. if (hash_map.count("umbum")) { std::cout
iptables / firewalld
iptables / firewalld
2018.08.15iptables 체인은 3가지. INPUT OUTPUT FORWARD : 나를 지나가는 패킷. 라우터 등에서 사용. iptables는 ip 헤더부터 잡힌다. 그 아래는 안잡힘. ```bash sudo iptables -L // 밖으로 나가는 icmp 막기 iptables -A OUTPUT -p icmp -j DROP iptables -D OUTPUT -p icmp -j DROP // 80번만 풀기. iptables는 위에서 부터 검사하다 break하기 때문에 먼저 써야 함. iptables -A OUPUT -p tcp --dport 80 -j ACCEPT // 밖으로 나가는 tcp 막기 iptables -A OUTPUT -p tcp -j DROP // netfilter queue로 패킷 보내기. ipta..
[C++] directory listing (traversal)
[C++] directory listing (traversal)
2018.08.10원래는 boost에 있는 API이고, C++ 17에서 표준으로 추가되었기 때문에, boost를 추가하거나 컴파일러를 C++17로 변경해야 한다.후자가 더 편하기 때문에, 프로젝트 설정 - C/C++ - Language - C++ Language Standard를 `` /std:c++17``로 변경해준다. ```cpp#include #include namespace fs = std::filesystem;using namespace std; int main(int argc, char **argv){ for (auto& p : fs::recursive_directory_iterator(root_path)) { /* .path() 메서드가 다시 path 객체를 리턴하기 때문에 C style의 입출력을 사용하지 ..