Operations Dev
-
종료Operations Dev/Producer 2010. 12. 11. 01:39
이서비스는 쓰레드로 만들었습니다. 그리고 윈도우는 메인함수에서 메인쓰레드라는게 존재한다. 그리고 각각 동작한다. 그리고 아까이야기 했듯이 클래스단위로 쓰레드화 하는게 아니고 하나의 컨숨?한 쓰레드가 됩니다. 이 프로듀서를 어디서 생성을 할까요->메인에서 생성할겁니다. 끄려면 강제종료를 시켜야하는데 그러면 메인이 종료됩니다. 그러면서 자식쓰레드들도 종료가됩니다. 그럼 소멸자가 어디서 불릴까? ->메인스레드 서비스함수들은 어디서 돌아가고 있을까? -> 각각 자기스레드 그럼 소멸자가 호출되는 순간 그 스레드들은 돌고있을까 안돌고있을까? -> 돌고있고 소멸자가 호출되도 돌리려고 시도 할 수 있다. -> 그러면 터진다 해결책 플래그변수를 불러요 -> Customer에 boolean변수 isEnd를 만든다 vola..
-
생산자 / 소비자Operations Dev 2010. 12. 11. 01:37
메인함수에서 소비자와 생산자의 쓰레드가 만들어지도록 호출하고 처리후 메인쓰레드가 종료될때 소멸자가 호출되는데 이 호출되는 순간에도 각자 자신의 쓰레드가 종료되지않고 돌고 있기 때문이다. 해결책은 메인쓰레드가 종료될때 소멸자가 호출되는것을 이용하여 소멸자가 호출되었을대 모든 자식 스레드를 종료할때까지 기다린다. 그다음 메인스레드가 종료되게하면 문제가 해결된다. ::WaitForSingleObject( ( HANDLE )( _thread ), INFINITE); 또한 이 생산자/소비자의 문제에서는 멀티코어에서 생길수 있는 동일 메모리공유 문제에 대해서는 volatile boolean변수로 플래그를 만들어 해결한다. 그러나 이경우에도 생산자와 소비자 서로의 쓰레드가 다르므로 터질가능성이 있다. 이경우에는 소멸..
-
Producer / CustomerOperations Dev/Producer 2010. 12. 10. 23:45
Producer.h #pragma once #include #include #include "Concurrency\Thread.h" #include "Customer.h" #include "Concurrency\Timer.h" #include "Concurrency\SpinLock.h" class Producer { public: Producer(float frequency); ~Producer(); public: void beginService(); bool tryPop( std::string * product); private: void service(); private: Thread * _thread; std::queue _products;//경쟁관계에 있는 녀석 Time..
-
자체 뮤텍스락 이용Operations Dev/Concurrency 2010. 12. 10. 22:09
// Test1.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include "stdafx.h" #include #include #include #include using namespace std; #include "Concurrency/Thread.h" #include "Concurrency/MutexLock.h" //이거 연결은 정적 라이브러리 연결 동적이 나올수도 있음 string g_buffer; MutexLock g_lock; //1000번 찍는데 락을 걸어주기 위해서 우리가 만든 락 클래스를 이용한다. int _tmain(int argc, _TCHAR* argv[]) { vectorthreads; //힙을 이용하면 new를 이용하면 생성하고 delete를 하면 우리가 생성 ..
-
자체 스핀락 이용Operations Dev/Concurrency 2010. 12. 10. 22:08
// Test.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include "stdafx.h" #include #include #include #include using namespace std; #include "Concurrency/Thread.h" #include "Concurrency/SpinLock.h" //이거 연결은 정적 라이브러리 연결 동적이 나올수도 있음 string g_buffer; SpinLock g_lock; //1000번 찍는데 락을 걸어주기 위해서 우리가 만든 락 클래스를 이용한다. int _tmain(int argc, _TCHAR* argv[]) { vectorthreads; //힙을 이용하면 new를 이용하면 생성하고 delete를 하면 우리가 생성 소멸 ..
-
ConcurrencyOperations Dev/Concurrency 2010. 12. 10. 22:07
-----Thread.h #pragma once #include //Rari? 리소스를 얻으면 바로 초기화한다.보통 윈도 api를 사용한다. 독립적으로 되려면 매기기 마다 컴파일해야한다. ios로 가면 ios api를 써야한다. class Thread { public: Thread( std::function const & threadFunc );//스레드를 만들 함수를 넘기다. 리턴타입없고 인자도없다. ~Thread(); public: unsigned int getThreadId() const; unsigned int getThreadHandle() const; private: Thread( Thread const & value ){} Thread & operator=( Thread ..
-
식사하는 철학자Operations Dev/Food 2010. 12. 10. 21:22
// Chapter06.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #include #include using namespace std; int const MAX_FORK = 5; int const MAX_PHILOSOPHER = 5; HANDLE g_forks[ MAX_FORK ]; HANDLE g_room; void eat( string const & philosopher ); void think( string const & philosopher ); unsigned int WINAPI startDinner( LPVOID param ); int _tmain(int ar..
-
MutexOperations Dev/writech 2010. 12. 10. 18:24
// Example02_Mutex.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include "stdafx.h" #include "Windows.h" #include //#include #include #include using namespace std; unsigned int WINAPI writeCharacter( LPVOID param); string g_string; int const MAX_THREAD = 5; HANDLE g_mutexHandle; int _tmain(int argc, _TCHAR* argv[]) { //가용 공간을 미리 예약해 놓는 부분, //g_string.reserve( MAX_THREAD * 1000 +1 ); g_mutexHandle = ::Cre..