在我的程序中,我有一个对象是全局cpp文件,它以整数作为参数。
//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;
}
我想在两个线程之间使用这种功能,但有没有办法在不在globals中创建对象的情况下实现这一点?
答案 0 :(得分: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为您初始化数据。
答案 1 :(得分:0)
听起来你正在使用依赖于静态初始化顺序(全局变量)的方法。您不能跨编译单元(即在不同的文件中)依赖该顺序。同一编译单元中的静态按其声明的顺序初始化。
对于解决方案,您可以考虑这一点:
答案 2 :(得分: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),但想法是您有一个点,两个线程等待另一个线程完成其任务,以便没有线程条件。