题意
提供一个指针数组struct entry *table[NBUCKET]
,启动多个thread按照key % NBUCKET
的结果往指针数组的某一个项的链表插入entry。由于并发过程中没有进行锁控制,如果多个thread同时操作同一个链表,可能会导致某个线程插入失败,例如:1
2
3
4
5
6
7
8t-A: calls insert() on bucket 1 (key = 6, 6 % NBUCKETS = 1)
t-B: calls insert() on bucket 1 (key = 21, 21 % NBUCKETS = 1)
...
...
t-A: executes e->next = n
t-B: executes e->next = n
t-A: executes *p = e
t-B: executes *p = e
t-A在执行e->next = n之后、执行*p = e之前,t-B执行了e->next = n,从而导致t-A没有成功插入。
解决思路
可参考的函数使用:1
2
3
4
5互斥锁的使用:
pthread_mutex_t lock; // declare a lock
pthread_mutex_init(&lock, NULL); // initialize the lock
pthread_mutex_lock(&lock); // acquire lock
pthread_mutex_unlock(&lock); // release lock
在put函数中添加锁控制。1
2
3
4
5
6
7
8
9
10static
void put(int key, int value)
{
pthread_mutex_lock(&lock); // acquire lock
int i = key % NBUCKET;
insert(key, value, &table[i], table[i]);
pthread_mutex_unlock(&lock); // release lock
}
编译并运行:1
2$ gcc -g -O2 ph.c -pthread
$ ./a.out 2
源代码
1 | #include <stdlib.h> |