gpt4 book ai didi

c - 互斥量应该存储在 main 中还是对象中?

转载 作者:行者123 更新时间:2023-12-04 10:44:51 25 4
gpt4 key购买 nike

以 C 中的对象为例:

/* object.h */

typedef struct Object Object;

Object* createObject();
void freeObject(Object* object);

int getObjectNumber(Object* object);
void incrementObjectNumber(Object* object);

这是一个非常简单的不透明类型,可以存储一个数字并可以递增它。

为了使我的代码线程安全,我有两个选择。第一种是在 Object 中存储互斥量:

void
func(Object* object)
{
incrementObject(object);
}

int
main()
{
Object* object = createObject();

Thread thread1 = startThread(func, object);
Thread thread2 = startThread(func, object);

waitThread(thread1);
waitThread(thread2);

freeObject(object);
}

第二种是在main中存放一个互斥量:

void
func(Object* object, Mutex mutex)
{
lockMutex(mutex);
incrementObject(object);
unlockMutex(mutex);
}

int
main()
{
Object* object = createObject();

Mutex mutex;

Thread thread1 = startThread(func, object, mutex);
Thread thread2 = startThread(func, object, mutex);

waitThread(thread1);
waitThread(thread2);

freeObject(object);
}

如果只有一个对象,哪一个是更好的做法?

最佳答案

无论是一个对象还是多个对象,最好将互斥量与不透明对象一起存储。首先,互斥锁和它保护的数据属于一体。而且,线程安全需要由您的“ADT”而不是调用者来处理。对对象的访问应该只通过 setter/getter 发生,它们将在内部处理线程安全。在这种情况下 incrementObject

这样你就可以声明你的整个库是线程安全的,它会照顾好自己而不是把责任推给别人。您的第一个示例具有更简洁的 API,而第二个示例要求调用者将互斥锁拖到用户定义的回调中,这不是一个干净的解决方案。

关于c - 互斥量应该存储在 main 中还是对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57788746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com