我在Linux上用C語言開發的代碼存在問題。C - 併發問題
我有這樣的結構:
typedef struct _my_sem {
unsigned int valid;
pthread_mutex_t m;
} my_sem;
和以下功能(錯誤管理不報告):
void my_sem_init(my_sem *s);
void my_sem_destroy(my_sem *s);
void my_sem_lock(my_sem *s);
void my_sem_unlock(my_sem *s);
void my_sem_init(my_sem *s)
{
pthread_mutex_create(&s->m);
s->valid = 1;
}
void my_sem_destroy(my_sem *s)
{
if (s->valid) {
pthread_mutex_destroy(&s->m);
s->valid = 0;
}
}
void my_sem_lock(my_sem *s) {
if (s->valid)
pthread_mutex_lock(&s->m);
}
void my_sem_unlock(my_sem *s) {
if (s->valid)
pthread_mutex_unlock(&s->m);
}
此代碼具有併發性的問題。如果有人試圖鎖定my_sem ,並且在某人銷燬objcet的同時,呼叫將失敗。
我該如何解決這個併發問題?
更改錯誤管理。嚴重的是,只需添加返回值檢查和perror來查看出了什麼問題。這就是錯誤出現的原因。 – LambdaBeta
這是很多線程可能試圖同時鎖定的常見情形。但爲什麼多個線程會試圖同時銷燬呢?當然,在「結束」的單一線程可以做到這一點? –
奇怪的是有一個線程試圖摧毀其他線程需要的資源... – LPs