2016-11-09 98 views
1

为什么这个代码是坏有人可以给我解释一下:互斥理解

int data; 
void* worker(void* arg __attribute__((unused))) { 
    pthread_mutex_t m; 
    pthread_mutex_init(&m, NULL); 
    for (int i = 0; i < N; i++) { 
     pthread_mutex_lock(&m); 
     data++; 
     pthread_mutex_unlock(&m); 
    } 
    pthread_mutex_destroy(&m); 
    return NULL; 
} 

这是确定的:

int data; 
pthread_mutex_t m; 
void* worker(void* arg __attribute__((unused))) { 
    for (int i = 0; i < N; i++) { 
     pthread_mutex_lock(&m); 
     data++; 
     pthread_mutex_unlock(&m); 
    } 
    return NULL; 
} 
// ... 
pthread_mutex_init(&m, NULL); 
// ... 
pthread_mutex_destroy(&m); 
// .. 

我总是需要在全球范围内声明的变量互斥?

+0

错误代码的实际含义是什么? –

+0

它在某些输入上无法正常工作。 – Welez

+0

http://stackoverflow.com/a/12776593/4593781,这篇文章可以帮助 –

回答

0

与当地mutex的问题是,这只是一个在mutex的本地访问版本......因此当thread锁定,以分享一些全局可访问数据的mutex,数据本身是不受保护的,因为所有其他thread将有它自己的本地mutex,可以锁定和解锁。它打败了互相排斥的整个观点。

我建议也要考虑异常安全。在这个特定的例子中,你只是在mutexlock/unlock中间做data++。那么如果你在将来会抛出异常,在pthread_mutex_unlock(&m);之前再发表一条陈述呢?阅读关于RAII