【问题标题】:Arrays of semaphore and mutual assignment in CC中的信号量数组和相互赋值
【发布时间】: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。所以MyArray 和MyArray+ 1 将是例如array+3 和array+1,这是相同的地址。
【问题讨论】:
标签:
c
arrays
pointers
semaphore
【解决方案1】:
如果不知道sem_t 的内部结构,分配或复制sem_t 对象的语义是不清楚的。
如果sem_t 是一个简单的句柄或指针,那么只需获取一个副本,两个副本都将引用相同的信号量。
如果sem_t 是一个 POD 结构,则可以进行逐字节复制,但该副本将是一个不同且独立的信号量。
如果 sem_t 不是 POD 并且包含指针,则 copyinmg 非常重要。
您可能真正想要的是MyArray 以sem_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] = &array[1]; 或任何你想要的
然后像 sem_wait(MyArray[0]); 一样使用它,这与您原来的 array 不同,后者是 sem_wait(&array[1]);,因为 MyArray 已经是基于指针的。