1
考慮以下 C 程式:
#include <pthread.h>
typedef struct node {
int val;
struct node *link;
pthread_mutex_t lock;
} node_t;
node_t ListHead = { .val = 0 };
node_t *node_delete(int val) {
node_t *prev, *current;
prev = &ListHead;
pthread_mutex_lock(&prev->lock);
while ((current = prev->link)) {
pthread_mutex_lock(¤t->lock);
if (current->val == val) {
prev->link = current->link;
current->link = NULL;
return current;
}
pthread_mutex_unlock(&prev->lock);
prev = current;
}
pthread_mutex_unlock(&prev->lock);
return NULL;
}
這是個目標能在多執行緒環境運作的 singly-linked list 實作,我們忽略新增節點的函式,並且聚焦在 delete
函式,後者的作用是從 linked list 中移除某個數值,演算法如下:
指出這個函式是否能符合演算法一般的運作,在下方挑出最接近的描述選項。
作答區
K = ?
(a)
可以運作,一看就知道是「慣 C」上乘之作;(b)
無法運作,應該在第 25 行後補上 pthread_mutex_unlock(¤t->lock);
(c)
無法運作,應該將第 23 行換成 pthread_mutex_unlock(¤t->lock);
(d)
無法運作,應該在第 19 行後補上 pthread_mutex_unlock(¤t->lock); pthread_mutex_unlock(&prev->lock);
(e)
無法運作,應該在第 19 行後補上 pthread_mutex_unlock(¤t->lock);
參考資訊:
延伸問題: