C 限制线程可以调用哪些函数

C 限制线程可以调用哪些函数,c,linux,multithreading,C,Linux,Multithreading,假设我们有一个多线程的Linux x86-64可执行文件(例如,用C编写),它有三个线程:main、consumer和producer。有些函数只供某些线程使用。例如,producer()函数只能由producer线程调用。我希望如果另一个线程(例如消费者)调用生产(),那么我们会得到一个致命错误(例如,SIGABRT或SIGSEGV) 处理此问题的一种方法是注册线程id,并检查调用product()的线程id实际上是producer线程id。如果不是,则调用abort()。不幸的是,该方法需要

假设我们有一个多线程的Linux x86-64可执行文件(例如,用C编写),它有三个线程:
main
consumer
producer
。有些函数只供某些线程使用。例如,
producer()
函数只能由
producer
线程调用。我希望如果另一个线程(例如
消费者
)调用
生产()
,那么我们会得到一个致命错误(例如,SIGABRT或SIGSEGV)

处理此问题的一种方法是注册线程id,并检查调用
product()
的线程id实际上是
producer
线程id。如果不是,则调用
abort()
。不幸的是,该方法需要对每个函数调用进行运行时检查,如果函数位于热路径中,这可能是禁止的

我想知道是否还有其他方法,例如注释所有用于
producer
的函数,然后将其移动到它们自己的部分,并删除所有其他线程的可执行内存访问-我的理解是,这不起作用,因为
mprotect()
设置了进程范围的权限-

编辑: @AlanAu询问是否必须在运行时执行此检查。这不是一个要求,但我的理解是,这种检查仅在运行时对使用函数指针的非平凡程序有效

编辑2:
我意识到使用进程将有助于解决这个问题,但正如评论中所指出的,线程间通信更有效。

一种/相当于hackey/的方法是为这些进程创建指针,并调用指针,而不是函数本身。例如:

void disallowed_call(void)
{ abort(); }

void testfunc(void)
{
     printf("Hello, world!\n");
}

void childcode(void (*notrestricted)(void), void (*restricted)(void);)
{
     printf("Non restricted call:\n");
     *notrestricted();
     printf("Restricted call:\n");
     *restricted();
}

int main()
{
     fork();
     if (getpid() == 0)
     {
          childcode(&testfunc, &testfunc);
     }
     else
     {
          childcode(&testfunc, &disallowed_call);
     }
     return 0;
}

这可能比你想要的要复杂一点,但它应该会起作用。运行时检查只执行一次。

我假设您的要求是,此限制必须在运行时执行,而不是在编译时执行?如果是这样的话,你能澄清你的问题吗?我肯定这是因为我不知道你的所有要求。但如果进程隔离是一项关键要求,那么它确实提出了一个问题:为什么不使用进程而不是线程。我相信其他人也会有同样的想法,所以也许也会澄清这一点。最终,除了使用单独的进程而不是线程之外,我认为除了在函数中执行运行时检查之外,您可以做的事情不多,您认为这太慢了。但真正的问题(至少)有两个:(1)为什么你认为程序员如此无能,以至于不能信任他们把事情做好;(2)为什么函数集之间的划分如此严格,以至于像这样把它们隔开是可取的,而代码(大概是这样的)需要比单独进程所允许的更紧密地共享数据结构(如果使用共享内存的话,这是有争议的)。不幸的是,这种方法需要对每个函数调用进行运行时检查,如果函数处于热路径,这可能是禁止的。你为什么这么认为?你测试过了吗?这可能微不足道。我的意思是,在
product()中执行的工作
和其他方法肯定比简单地检查线程id要复杂得多、耗时得多。在我看来,你似乎陷入了早期优化陷阱。你在编写代码时不能控制自己,还是像一群猴子试图搞定莎士比亚?这可能真的行得通:一种变体是让公众参与进来函数是TLS指针,可调用时用有效的静态函数初始化,不可调用时保持原样。我不会让它们保持原样,但会实现一个“不允许”的函数。另一种方法是让API函数在允许时调用函数,或者在不允许时调用函数时失败,但这相对于任务来说非常复杂