2009-04-16 5 views
1

내 프로그램에서 정수로 인수를 사용하는 개체가 전역 cpp 파일에 있습니다. C++ 무작위 시드, 전역 개체 및 SDL_Threads

//In global header 
extern Object example; 

//In global cpp file 
Object example((rand() % 6)); 

나는 임의의 숫자는 객체의 주장에 발생하기를 원하지만 씨앗은 주 나중에라는 또 다른 CPP 파일에서 만든 씨앗으로, 글로벌 변수에 도달하지 않습니다.

내 가장 큰 문제는 임의의 시드가 global.cpp에서 개체의 인수에 도달하지 못한다는 것입니다. 그러나 스레드와 관련된 특정 이유 때문에 거기에 넣습니다.

내 주요 질문 : 임의의 시드가 전역 변수에 도달 할 수 있습니까? 예

은 (또한 경우 예, 다음 질문은 무관하다) 방법,

을 말씀 해주십시오 그러나 그것은 가능하지 경우이 문제는 스레드와 개체를 만들 수있는 곳으로 간주합니다. ,

//은 A가

int thread(void *data) 
{ 
    example.showimage(); 

    return 0; 
} 

//ThreadB 
int thread(void *data(
{ 
    example.moveimage(); 

    return 0; 
} 

나는 2 개 스레드 사이의 이러한 종류의 기능을 원하는 쓰레드 : 객체 클래스는 다음과 같은, 실행 스레드에서 함수를 호출하고 다른 스레드에서 다른 함수를 호출 하지만 전역에 객체를 만들지 않고이 작업을 수행 할 수있는 방법이 있습니까?

답변

0

통계 (전역)의 초기화 순서에 의존하는 것처럼 들리는 것 같습니다. 컴파일 단위 (예 : 다른 파일)에서 해당 주문을 사용할 수 없습니다. 같은 컴파일 단위의 통계는 선언 된 순서대로 초기화됩니다.

솔루션의 경우, 당신은이를 고려해 볼 수 있습니다 :

How do I prevent the "static initialization order fiasco"?

1

싱글 톤 패턴을 사용하는 것이 작업을 수행하는 가장 좋은 방법은 (이 예는 스레드 안전하지 않는다) :

//in a header 
class RandomSeed 
{ 
public: 
    static RandomSeed& instance() 
    { 
     static RandomSeed the_instance; 
     return the_instance; 
    } 
    int value() const {return value_;} 
private: 
    RandomSeed() {/*initialization code*/} 
    RandomSeed(const RandomSeed& rs); // disallowed 
    RandomSeed& operator=(const RandomSeed& rs); // disallowed 
    int value_; 
}; 

// in your file 
#include "random_seed.h" 
srand(RandomSeed::instance().value()); 

스레드 안전을 구현하려면 이중 잠금 또는 다른 잠금 메커니즘을 사용하십시오. 또 다른 옵션은 Boost.call_once을보고 데이터를 초기화하는 것입니다.

0

static initialization problem을 직면하고 있습니다. 가장 쉬운 방법은 초기화 프로세스를 제어 할 수 있도록 Singleton을 구현하는 것입니다. 다중 스레드 코드를 사용할 때 Singleton은 스레드 안전성 (고려해야 double check locking) 패턴을 생성해야하며, 아마도 뮤텍스와 경쟁 조건을 피하기위한 조건이 있어야합니다. 이 부분에 대한 문서는 스레딩 라이브러리 설명서를 확인하십시오. 일반적인 의사 코드는 다음과 같습니다

// image_control would be 'example' in your two last snippets 
// painter 
image image_control::obtain_picture() 
{ 
    mutex.acquire(); 
    while (! image_already_created) 
     image_creation_condition.wait(); // wait for image creation 
    image res = the_image; 
    image_already_created = false; // already consumed 
    image_consumption_condition.signal(); // wake up producer is waiting 
    mutex.release(); 
    return res; 
} 
// image creator 
void image_control::create_picture(image new_image) 
{ 
    mutex.acquire(); 
    while (image_already_created) 
     image_consumption_condition.wait(); // wait for image to be consumed 
    the_image = new_image; 
    image_already_created = true; 
    image_creation_condition.signal(); // wake up consumer if it is waiting 
    mutex.release(); 
} 

귀하의 스레딩 라이브러리가 아마 (뮤텍스 획득 및 해제()에 대한 RAII) 더 나은 구조를 가지고 있지만 아이디어는 당신이 두 개의 스레드가 다른 대기 한 지점을 가지고있다 스레드 조건이 없도록 작업을 완료하십시오.