gpt4 book ai didi

C++/Linux - 是否可以将特定于上下文的数据注入(inject)到创建的每个线程中

转载 作者:太空宇宙 更新时间:2023-11-04 12:29:57 24 4
gpt4 key购买 nike

我有一个应用程序上下文的概念,它是在我的流程中的某个范围内创建和使用的。这个上下文可以包含特定于上下文的单例之类的东西。每当我创建一个线程时,我都会将上下文传递给线程,这样线程中的所有代码都可以查看相同的上下文。这一切都很好而且花花公子,但是当线程是由我无法控制的第 3 方库创建时,我遇到的问题就出现了。

我正在尝试找到一种方法来拦截我的应用程序中的所有线程创建,以便我可以确保将上下文传递给所有线程,无论它们是否由我创建。我试图避免拦截 pthread_create 主要是因为我不想为此依赖 LD_PRELOAD。如果有某种方法可以获取线程的“父”线程 ID,我可以查找父线程的上下文,但看起来不可能。
如果我可以设置一些特定于线程的属性,这些属性将被所有子线程继承,那可能会起作用,但我还是没有看到任何可行的东西。

TLDR;有没有任何可能的方法让我的父线程的上下文传递到我不直接创建的子线程,而无需 LD_PRELOAD-ing pthread_create 拦截方法?

编辑:我不确定要在此处发布什么代码,但这是我控制线程创建时的样子。我使用自己的线程类而不是 std::thread 来包装要调用的方法并通过以下方式传递上下文:

class thread : public std::thread
{
public:
thread() {}

template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args ) : thread( "", std::forward<Function>( f ), std::forward<Args>( args )... )
{}

template< class Function, class... Args >
explicit thread( const char * thread_name, Function&& f, Args&&... args ) : std::thread( thread::wrap<std::decay_t<Function>,std::decay_t<Args>...>,
AppContext::impl(), std::forward<Function>( f ), std::forward<Args>( args )... )
{
if( thread_name && *thread_name )
setThreadName( thread_name );
}

void setThreadName( const char * thread_name );

private:
template< class Function, class... Args >
static void wrap( std::weak_ptr<AppContextImpl> impl, Function&& f, Args&&... args )
{
AppContext threadContext( impl );
f( std::forward<Args>( args )... );
}
};

最佳答案

为什么库内部线程需要您的上下文变量?该线程可能不会运行您的一行代码,这意味着它也不需要您的数据。

因此,最简单的解决方案是将对该上下文的访问包装在一个类中。该类将在第一次访问时实例化上下文的拷贝。没有访问权限,没有上下文创建,没有开销。

关于C++/Linux - 是否可以将特定于上下文的数据注入(inject)到创建的每个线程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59055500/

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