什么是最好的方式来创建一个单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;
}

也适用于并发环境。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top