假设我有一个具有静态函数的类。该类的构造函数使用静态函数作为其入口点执行pthread_create。C++静态函数复制
我的问题是:
如果我有这个类的多个实例,它们都将运行使用该函数自己的线程?这样做有什么问题吗?而且...如果函数本身有静态变量,我是否会遇到一个问题,它不能重入?
假设我有一个具有静态函数的类。该类的构造函数使用静态函数作为其入口点执行pthread_create。C++静态函数复制
我的问题是:
如果我有这个类的多个实例,它们都将运行使用该函数自己的线程?这样做有什么问题吗?而且...如果函数本身有静态变量,我是否会遇到一个问题,它不能重入?
如果您的构造函数每次都执行pthread_create()
,那么您将拥有与对象一样多的线程。如果这些线程访问类中的变量,则需要确保对这些变量的访问受互斥锁保护。 (另外,如果这些线程访问非static
变量,则您也需要保护这些,而不是其他调用者到对象的方法)。
每个对象一个线程可能太多了,所以您可能需要重新考虑您的设计。
是的,所有的类都会启动一个具有相同功能的新线程。就像他们使用非成员函数一样。
至于函数静态变量,即是个问题。因为C++实际上并没有定义任何关于并发的东西,所以你可能正在寻找竞争条件。即使在这些函数静态变量的构造中。在C++ 0x支持可用之前,您需要为CPU寻找针对编译器的线程功能,以便您可以告诉它将这些函数静态变量设置为“线程本地”。这样,每个线程都获得它们自己的副本。
不太清楚'自己的线程'是什么意思,但最后一个问题的答案是肯定的,你会遇到问题。 – john
如果您将每个类的“this”指针传递到您的静态函数入口点,以便每个线程都可以从其自己的类实例中访问成员,那么您就不会遇到任何问题。 – Erik