既然你提到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);
}
我不能按照你的要求。你有16个东西(不知道它们是整数还是什么)。你是否试图制作一个基于MD5哈希的哈希表? – CrazyCasta
至此,我有16个数组,每个数组都有很多整数。数组中的每个整数点的散列将被存储,正如我在我的问题中所解释的。 –
@CrazyCasta,是的,基于MD5哈希的哈希表类型 –