既然你提到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哈希的哈希表類型 –