2012-12-06 2 views
2

개별 스레드에서 작업을 실행하는 C++ 멀티 스레드 응용 프로그램이 있습니다. 각 작업에는 출력을 처리하고 저장하는 객체가 있습니다. 각 작업은 서로 다른 비즈니스 논리 개체와 아마도 다른 스레드 또는 스레드 풀을 만듭니다.여러 개의 싱글 톤 : 각 작업마다 하나씩

내가 원하는 것은 "출력"개체를 각 비즈니스 논리 개체에 수동으로 전달하지 않고 각 작업의 출력에 액세스하기 위해 작업별로 실행되는 비즈니스 논리 개체에 대해 쉬운 방법을 제공합니다.

내가 보는 것은 출력 싱글 톤 팩토리를 만들고 TLS에 task_id를 저장하는 것입니다. 그러나 문제는 비즈니스 로직이 새 스레드 또는 스레드 풀을 만들고 해당 스레드가 TLS에 task_id를 갖고 있지 않을 때입니다. 이 방법으로 부모의 스레드 TLS에 대한 액세스 권한이 필요합니다.

다른 방법은 작업 시작 이후 모든 출력을 간단히 가져 오는 것입니다. 그 시간에 다른 작업에서 출력되지만, 적어도, 아무것도보다 더 나은 ...

나는 내 문제를 해결하는 깨끗하고 예쁜 방법의 제안이나 아이디어를 찾고 있습니다. 감사.

upd : 그래, 그건 singletone 아니에요. 다음과 같이이 객체에 액세스 할 수 있기를 바랍니다.

output << "message"; 

그리고 그게 전부입니다. 비즈니스 로직 클래스간에 출력 객체에 대한 포인터를 전달할 필요가 없습니다. 작업마다 전역 출력 개체가 있어야합니다.

+3

멀티 스레딩 + 싱글 톤 = 죽음 + 파괴 (보통) –

답변

1

응용 관점에서 보면 싱글 톤이 아니므로 싱글 톤과 같은 객체를 다루는 이유는 무엇입니까?

출력 저장소의 새 인스턴스를 만들고 (스마트?) 포인터를 새 스레드에 전달합니다. 주 기능은 포인터를 TLS에 넣을 수 있기 때문에 스레드 당 인스턴스를 전역으로 만듭니다. (현명한 디자인 결정이라고는 생각하지 않지만 묻습니다.) 새 (하위 -) 스레드를 만들 때 포인터를 다시 전달할 수 있습니다. 그래서 나에 따르면 어떤 싱글 톤이나 공장도 필요하지 않습니다.

+0

그래, 새로 만든 스레드에서 TLS에 포인터를 저장하는 것에 대해 생각했습니다. 하지만 정말 특별한 스레딩 기능을 갖는 것이 싫습니다. – DemonShi

+0

TLS없이 "스레드 당 싱글 톤"을 어떻게 계획합니까? 어쨌든, 나는 생성자를 통해 참조를 전달하고 싱글 톤으로 귀찮게하지 않을 것이지만, 그것은 나의 접근법이다. – stefaanv

+0

BTW : TLS 접근법을 사용하면'output <<) 메시지 대신에'output() << "메시지를 보게 될 것입니다. – stefaanv

0

올바르게 이해한다면, 여러 클래스 인스턴스 (각각은 반드시 같은 클래스는 아니지만) 모두가 스레드 안전성이 필요한 공통 데이터 풀에 액세스 할 수 있어야합니다. 나는 이것을 할 수있는 몇 가지 방법을 생각할 수있다. 첫 번째 아이디어는 다른 클래스 각각에 포함 된 클래스에이 데이터 풀을 갖는 것입니다. 이 데이터 풀은 실제로 데이터를 정적 멤버에 저장하므로 데이터 풀 클래스의 인스턴스가 둘 이상 존재하더라도 데이터 인스턴스가 하나만 존재합니다. 클래스에는이 정적 데이터 풀에 액세스하는 접근 자 메서드가 있습니다 (투명하도록). 스레드를 안전하게 만들려면 액세스가 뮤텍스 또는 이와 유사한 것을 통과해야합니다.

+0

아니요. 각 작업 내에 공통 데이터 풀만 있습니다.그러나 전 세계적으로 N 개의 출력 객체와 N 개의 작업이 있습니다. – DemonShi

+0

그래서 모든 작업에서 출력이 공통입니까? 나는 그 맥락에서 그렇지 않다면 당신이 "각 작업의 결과에 접근하라"라는 의미를 이해하지 못한다. 그렇다면 내 대답이 효과적 일 것이며 일반적인 결과물을 "데이터 풀"로 간주 할 것입니다. 그렇지 않다면, 나는 각 비즈니스 로직이 원하는 출력 부분을 이해할 수있는 방법을 가지고 있다고 가정하고 공통점을 그로부터 도출 할 수 있습니다. 도움이되기를 바랍니다. 아웃풋이 무엇인지, 그리고 몇몇 태스크의 비즈니스 로직이 무엇을 하려는지 조금 더 잘 이해하면 더 많은 것을 도울 수있을 것입니다. – hvanbrug