问题描述
在尝试使用c11 thread.h和互斥锁来同步网络主题和主线程时,我使用以下过程开始了
-在主函数中定义互斥锁
mtx_t mutex_network_acqbuffer;
-使用
初始化mtx_init(&mutex_network_acqbuffer,mtx_plain);
-将该互斥对象的指针分配给分配给我的网络线程的起始参数的堆分配结构的成员
将互斥锁锁定在主线程/网络线程中,以确保不会同时访问堆中的某些数据。
但是我不确定这是否是正确的方法,还是我很幸运我的编译器没有破坏我的代码。
我要强调的是,互斥体位于主线程的堆栈中,因此子线程应该不能访问它,因为它只能访问堆分配的内容或全局变量。
但是,同步似乎仍然有效。
mtx_init内部是否存在一些魔术技巧,将互斥锁放在堆上? 还是这仅取决于实现? 我是否应该在主线程中将互斥锁分配到保存侧/使其成为全局变量?
解决方法
在C11中,是否可以从不同线程访问堆栈上的对象的事实是实现定义的。 我个人不知道任何实现不提供其他线程访问的实现。