0

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

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

mtx_t mutex_network_acqbuffer;

- 初始化它

mtx_init(&mutex_network_acqbuffer,mtx_plain);

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

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

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

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

但尽管如此,同步似乎工作。

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

4

1 回答 1

0

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

于 2020-08-25T05:52:02.377 回答