【问题标题】:Sharing mutexes stored on the main thread's stack with a child thread与子线程共享存储在主线程堆栈中的互斥锁
【发布时间】:2020-08-25 00:52:42
【问题描述】:

在尝试使用 c11 threads.h 和互斥锁来同步网络线程和主线程时,我开始使用以下过程:

-在主函数中定义一个互斥体

mtx_t mutex_network_acqbuffer;

-用

初始化它
mtx_init(&mutex_network_acqbuffer,mtx_plain);

-将此互斥体的指针分配给作为起始参数传递到我的网络线程中的堆分配结构的成员

-在主线程/网络线程中锁定互斥体,以确保堆中的某些数据不会同时访问。

但我不确定这是否是正确的方法,或者我很幸运我的编译器没有破坏我的代码。

我认为互斥锁驻留在主线程的堆栈中,所以子线程应该不能访问它,因为它应该只能访问堆分配的东西或全局变量。

但同步似乎工作。

在 mtx_init 中是否存在一些将互斥体放置在堆上的魔术技巧? 或者这只是实现依赖? 我应该将主线程中的互斥锁分配到保存端/使其成为全局变量吗?

【问题讨论】:

  • 对我来说听起来不错。没有问题(除了生命周期问题),在一个线程中取消引用指向存储在另一个线程堆栈中的对象的指针。只要对象仍然存在,您就可以访问它。

标签: c multithreading mutex c11 threads.h


【解决方案1】:

在 C11 中,堆栈上的对象是否可以从不同线程访问的事实是实现定义的。 不过,我个人不知道任何不提供其他线程访问权限的实现。

【讨论】:

  • 谢谢,您的回答激发了我再次搜索的灵感,同时更多地关注实现依赖性,例如根据此 stackexchange:stackoverflow.com/questions/49794624/…,pthreads 将按照您的描述行事。因为我使用的是一个包含 pthread 的 thread.h 兼容头文件,所以我可以确定它会起作用。
  • @Beny Benz 它会工作,但我会小心确保你 pthread_join 子线程的某个地方,互斥锁仍在范围内,以确保孩子没有尝试访问或覆盖某些东西其他在内存中。
  • @Lytigas ..假设线程完全连接。并不总是需要 pthread_join 线程。
猜你喜欢
  • 2013-01-31
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多