C中的信号量数组和相互赋值

Posted

技术标签:

【中文标题】C中的信号量数组和相互赋值【英文标题】:Arrays of semaphore and mutual assignment in C 【发布时间】:2014-12-08 20:43:21 【问题描述】:

我正在尝试在 C 中使用信号量。

我有全局变量:`sem_t array[5];'

以及函数中的本地sem_t MyArray[2];

我初始化我的信号量。

for(i = 0; i < 5; i++)
    sem_init(&array[i], 0, 1);

我想将数组中的 5 个信号量中的 2 个分配给 MyArray。所以MyArrayMyArray+ 1 将是例如array+3array+1,这是相同的地址。

【问题讨论】:

【参考方案1】:

如果不知道sem_t 的内部结构,分配或复制sem_t 对象的语义是不清楚的。

如果sem_t 是一个简单的句柄或指针,那么只需获取一个副本,两个副本都将引用相同的信号量。

如果sem_t 是一个 POD 结构,则可以进行逐字节复制,但该副本将是一个不同独立的信号量。

如果 sem_t 不是 POD 并且包含指针,则 copyinmg 非常重要。

您可能真正想要的是MyArraysem_t* 的类型引用 array

// By initialisation
sem_t* MyArray[2] =  &array[3], &array[1]  ;

// By assignment
sem_t* MyArray[2] ;

MyArray[0] = &array[3] ;
MyArray[1] = &array[1] ;

【讨论】:

【参考方案2】:

尝试使用指向原件的指针,而不是副本

sem_t* MyArray[2];

然后分配MyArray[0] = &amp;array[1]; 或任何你想要的

然后像 sem_wait(MyArray[0]); 一样使用它,这与您原来的 array 不同,后者是 sem_wait(&amp;array[1]);,因为 MyArray 已经是基于指针的。

【讨论】:

以上是关于C中的信号量数组和相互赋值的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中使用信号量控制线程顺序

信号量同步编程

C 中具有共享内存和信号量的客户端服务器程序

如何处理这两个相互依赖的信号?

进程同步与相互排斥:POSIX有名信号量

在程序中利用信号量同步来模拟生产者与消费者