如何公开分配资源的线程安全接口? 我试图为我的C++库公开一个C接口。这主要涉及允许用户创建、启动、查询状态,然后发布后台任务的功能 任务是在C++类中实现的,成员通过一个 STD::互斥体< /代码>。

如何公开分配资源的线程安全接口? 我试图为我的C++库公开一个C接口。这主要涉及允许用户创建、启动、查询状态,然后发布后台任务的功能 任务是在C++类中实现的,成员通过一个 STD::互斥体< /代码>。,c++,c,multithreading,thread-safety,C++,C,Multithreading,Thread Safety,当我为这个后台任务公开一个C接口时,我的问题就来了。基本上我说了以下函数(假设task\u t是一个不透明的指针,指向包含实际任务类的实际结构): 我的目标是使这些函数的任何并发使用都是线程安全的,但是我不确定具体如何实现,也就是说,如果一个客户端代码线程调用mylib\u task\u正在运行(),而另一个线程调用mylib\u task\u release(),那么一切都很好 起初,我考虑在任务的实现中添加std::mutex,但这意味着mylib\u任务发布()末尾的delete语句必须在

当我为这个后台任务公开一个C接口时,我的问题就来了。基本上我说了以下函数(假设
task\u t
是一个不透明的指针,指向包含实际任务类的实际结构):

我的目标是使这些函数的任何并发使用都是线程安全的,但是我不确定具体如何实现,也就是说,如果一个客户端代码线程调用
mylib\u task\u正在运行()
,而另一个线程调用
mylib\u task\u release()
,那么一切都很好

起初,我考虑在
任务的实现中添加
std::mutex
,但这意味着
mylib\u任务发布()末尾的
delete
语句必须在未持有mutex时发生,这意味着它不能完全解决问题

我还考虑过使用某种引用计数,但最终还是遇到了同样的问题,即实际的删除可能在调用假设的
retain()
函数之后立即发生


我觉得应该有一个(相对)简单的解决方案,但我不能完全付诸实践。我如何才能做到不必强制客户端代码保护对
任务的访问?

如果要删除任务,您应该确保没有其他人有指向它的指针

如果一个线程正在删除任务,而另一个线程正在尝试获取其互斥体,那么很明显,您不应该删除该任务


共享PTR对此很有帮助。

你不能在
mylib\u task\u release()
中获取
task\u t
互斥体吗?问题是,如果互斥体是task\t结构的一个成员,那么我需要在互斥体锁定时删除该任务,并且根据,
如果互斥体由任何线程拥有,或者如果任何线程在持有互斥体的任何所有权时终止,则该行为是未定义的
共享_指针不能解决这个问题吗?@Devlus怎么解决?祝你好运。我差点忘了。这里有一个简单/粗糙的任务块示例,我把它作为一个答案放在一起:另外,linux内核源代码将是一个很好的资源感谢您提供了一个答案。我不确定
shared\u ptr
对您描述的内容有何帮助,因为这是一个C API,我不确定如何确保没有其他人拥有指向任务的指针,因为此API返回指针,而我无法控制客户端代码使用此指针做什么。对已发布的任务调用API函数有意义吗?是的。但我最担心的是它至少不会崩溃。我只是重新阅读了你的问题——最困难的情况是“running()被调用,而release()应该释放资源”。这已经表明您的互斥体需要更高,并且由于您不想在任务*被销毁后访问它,它向我暗示您需要跟踪哪些任务无效。您需要一个“TaskManager”类来执行同步,并确保任务*在获取互斥后有效。是的,我逐渐意识到我需要一个更高级别的机制来跟踪这一点,并可能以非侵入性的方式将任务与互斥体关联。
task_t* mylib_task_create();
bool mylib_task_is_running(task_t* task);
void mylib_task_release(task_t* task);