2016-07-08 2 views
0

현재 pthread를 사용하고 있는데, 1 초 동안 대기하고 로그 파일에 쓰고 화면에 인쇄합니다. 내 int main()에서는 while 루프가 영원히 계속 실행되지만 결국 멈출 것이다. 이 루프에서는 내 싱글 톤 클래스 인 로거에 액세스하고 쓰기 작업을 수행하며 화면에도 인쇄합니다. 여기에 초를 기다리는 스레드 함수 ... 여기싱글 톤 클래스에 액세스하는 두 개의 스레드 - 올바르게 작동하지 않습니다.

void Beacon::send(){ 
while(1){ 
    sleep(1); 
    Logger* logger = Logger::getInstance(); 
     logger->log("Sending"); 
} 
} 

또한 로거에 인쇄 while 루프는

Logger* Logger::getInstance(){ 
if(logger == NULL){ 
    logger = new Logger(); 
} 

return logger; 

} 여기

... 로거 인스턴스 funciton를 얻을 수있어 것입니다 . checkQueue의 funciton는

while(!a){ 

     logger->getInstance()->log("Checking..."); 
     checkQueue(); 



     if(a == true) 
      break; 

} 

나는 그것이 while 루프 로그인이

은, 그것은 단지 화면으로 확인 인쇄 할 것입니다 ... 지금 아무것도하지 않습니다. 내가 주석을 달아 주면 화면으로 전송됩니다. get 인스턴스 함수에서 이중 잠금 검사가 필요합니까? 나는 그것을 조사하려고 노력했지만 그것을 구현하는 방법을 이해하지 못한다.

+2

내가 어떤 스레드를 볼 수 없습니다 또는 거기에 코드를 잠그십시오. 또한 소위 "Mayer"싱글 톤 패턴을 추천합니다. https://stackoverflow.com/questions/1008019/c-singleton-design-pattern – Galik

+0

이 C++ 11 또는 C++ 03입니까? –

+0

메인 루프 내부에서 잠을 자면 '신호'의 '보내기'가 나타나기 시작합니까? 당신은 당신의 잠금 코드를 보여주지 않았지만, 메인의 루프가 너무 빡빡하고 잠금 장치를 너무 자주 잡아서 '비컨 (Beacon)'이 잠금 장치를 잡는 것을 거의 불가능하게 만들 가능성이 있습니다. –

답변

2

C++ (11)의 싱글 톤을 만드는 가장 쉬운 방법은 이것이다 : 지역 정적 변수의 초기화에 스레드로부터 안전

MyClass& MyClass::getInstance() { 
    static MyClass instance; 
    return instance; 
} 

C++ 11

+0

나는 한 번에이 작업을 수행했는데, 계속해서 계속해서 점검하고 인쇄 한 적이 없었습니다. – ThatBoiJo

+0

그것은'Logger' 클래스 안에서 경쟁 할 것입니다. mutex 또는 조건 변수를 사용하여이를 방지 할 수 있습니다. 로거의 내부 버퍼도 플러시하는지 확인하십시오. –

관련 문제