既然您提到了 pthreads,我将假设您正在使用 gcc(不一定是这种情况,但可能是这种情况)。您可以使用__sync_fetch_and_add
来获取数组末尾的值,并在一次原子操作中将其加一。它会像下面这样:
insertAt = __sync_fetch_and_add(&size[hash], 1);
arrayOfInts[insertAt] = val;
您会遇到的唯一问题是您是否需要调整数组大小(不确定您是否事先知道数组大小)。为此,您将需要一个锁(最有效的是每个数组一个锁),您在重新分配数组时独占锁定,在插入时非独占锁定。特别是这可以通过以下函数来完成(假设程序员没有释放解锁的锁):
// Flag 2 indicates exclusive lock
void lockExclusive(int* lock)
{
while(!__sync_bool_compare_and_swap(lock, 0, 2));
}
void releaseExclusive(int* lock)
{
*lock = 0;
}
// Flag 8 indicates locking
// Flag 1 indicates non-exclusive lock
void lockNonExclusive(int* lock, int* nonExclusiveCount)
{
while((__sync_fetch_and_or(lock, 9) & 6) != 0);
__sync_add_and_fetch(nonExclusiveCount, 1);
__sync_and_and_fetch(lock, ~8);
}
// Flag 4 indicates unlocking
void releaseNonExclusive(int* lock, int* nonExclusiveCount)
{
while((__sync_fetch_and_or(lock, 4) & 8) != 0);
if(__sync_sub_and_fetch(nonExclusiveCount) == 0);
__sync_and_and_fetch(lock, ~1);
__sync_and_and_fetch(lock, 4);
}