题
什么是最好的方式来创建一个单C?一个并行的解决方案将是很好的。
我知道,C并不是第一语言使用一个单独的.
解决方案
首先,C不适合OO编程。如果你这样做,你会一直在战斗。其次,单例只是具有一些封装的静态变量。所以你可以使用静态全局变量。然而,全局变量通常具有与其相关的太多弊病。否则您可以使用函数本地静态变量,如下所示:
int *SingletonInt() {
static int instance = 42;
return &instance;
}
或更聪明的宏:
#define SINGLETON(t, inst, init) t* Singleton_##t() { \
static t inst = init; \
return &inst; \
}
#include <stdio.h>
/* actual definition */
SINGLETON(float, finst, 4.2);
int main() {
printf("%f\n", *(Singleton_float()));
return 0;
}
最后,请记住,单身人士大多被滥用。很难让它们正确,特别是在多线程环境下......
其他提示
你不需要。 C已经有全局变量,所以你不需要解决它们来模拟它们。
它与C ++版本相同。只需要一个返回实例指针的函数。它可以是函数内部的静态变量。根据平台,使用临界区或pthread互斥体包裹功能体。
#include <stdlib.h>
struct A
{
int a;
int b;
};
struct A* getObject()
{
static struct A *instance = NULL;
// do lock here
if(instance == NULL)
{
instance = malloc(sizeof(*instance));
instance->a = 1;
instance->b = 2;
}
// do unlock
return instance;
};
请注意,您还需要一个功能来释放单身人士。特别是如果它抓取了在进程退出时未自动释放的任何系统资源。
C中的单身人士会非常奇怪。 。 。我从未见过“面向对象的C”的例子。看起来特别优雅。如果可能,请考虑使用C ++。 C ++允许您选择要使用的功能,许多人只是将其用作“更好的C”。
下面是一个非常典型的无锁一次性初始化模式。如果前一个为null,则InterlockCompareExchangePtr以新的值原子交换。这可以保护多个线程同时尝试创建单例,只有一个会获胜。其他人将删除他们新创建的对象。
MyObj* g_singleton; // MyObj is some struct.
MyObj* GetMyObj()
{
MyObj* singleton;
if (g_singleton == NULL)
{
singleton = CreateNewObj();
// Only swap if the existing value is null. If not on Windows,
// use whatever compare and swap your platform provides.
if (InterlockCompareExchangePtr(&g_singleton, singleton, NULL) != NULL)
{
DeleteObj(singleton);
}
}
return g_singleton;
}
DoSomethingWithSingleton(GetMyObj());
这里是另一个角度来看:每一个文件中的C节是一个有效的单独类自动化在运行时并不能子类.
- 全球静态变量是你的私人类的成员。
- 全球非静态是公众(只是宣布它们使用
extern
在一些标题的文件)。 - 静态功能是私人的方法
- 非静态功能是公众的人。
给予一切适当的前缀,现在你可以使用 my_singleton_method()
来代替 my_singleton.method()
.
如果你单身是复杂的,你可以写 generate_singleton()
初始化方法之前使用,但后来你需要确保所有其他公共方法检查,如果它被称为和错误出,如果没有。
只做
void * getSingleTon() {
static Class object = (Class *)malloc( sizeof( Class ) );
return &object;
}
也适用于并发环境。