假设我们有一个多线程的Linux x86-64可执行文件(例如用C编写),有三个线程:main
,consumer
和producer
。某些功能仅供某些线程使用。例如,produce()
函数只应由producer
线程调用。我希望如果另一个线程(例如consumer
)调用produce()
,那么我们会收到致命错误(例如SIGABRT或SIGSEGV)。
解决此问题的一种方法是注册线程ID,并检查调用produce()
的线程ID实际上是producer
线程ID。如果没有,请致电abort()
。遗憾的是,该方法需要对每个函数调用进行运行时检查,如果函数处于热路径中,则可能会禁止。
我想知道是否有另一种方式,例如注释然后将所有用于producer
的函数仅移动到它们自己的部分并删除所有其他线程的可执行内存访问 - 我的理解是这不会'自mprotect()
设置进程范围的权限以来工作 - ?
编辑: @AlanAu询问是否必须在运行时完成此检查。这不是一个要求,但我的理解是这样的检查只能在运行时用于使用函数指针的非平凡程序。
EDIT2: 我意识到使用进程有助于解决这个问题,但正如评论中所指出的,线程间通信更有效。
答案 0 :(得分:1)
一个/相当hackey /这样做的方法是为这些指针指针并调用指针而不是函数本身。例如:
scanf
这可能比你想要的要复杂一点,但它应该有效。运行时检查只进行一次。