[英]How do I read/write a shared variable with pthreads?
我有兩個線程,在Linux上使用C pthreads。 其中一個寫入數據,另一個正在讀取數據。 我正在使用一個變量來允許在允許讀取時讀取線程,在允許時寫入一個線程。 因此,互斥鎖適用於名為“ newData”的布爾變量。 我的問題是:我是否需要在“ if”條件下的訪問周圍鎖定/解鎖互斥鎖? 兩種方法都有效,但是我認為這是因為在此變量上重疊寫入/讀取的機會很少。 我展示了兩種選擇來更好地解釋我的問題:
線程1:
pthread_mutex_lock( &lattice_mutex );
if (!newData) {
pthread_mutex_unlock( &lattice_mutex );
uchar *lattice_pos = lattice;
int i;
for(i=0; i<size; i++) {
*lattice_pos = rand()%CHAR_MAX;
lattice_pos++;
}
pthread_mutex_lock( &lattice_mutex );
newData = TRUE;
pthread_mutex_unlock( &lattice_mutex );
} else {
pthread_mutex_unlock( &lattice_mutex );
}
線程2:
pthread_mutex_lock( &lattice_mutex );
if(newData) {
pthread_mutex_unlock( &lattice_mutex );
renderUpdate();
pthread_mutex_lock( &lattice_mutex );
newData = FALSE;
pthread_mutex_unlock( &lattice_mutex );
} else {
pthread_mutex_unlock( &lattice_mutex );
}
第二個版本,可以用,但我不知道它是否正確:
線程1:
if (!newData) {
uchar *lattice_pos = lattice;
int i;
for(i=0; i<size; i++) {
*lattice_pos = rand()%CHAR_MAX;
lattice_pos++;
}
pthread_mutex_lock( &lattice_mutex );
newData = TRUE;
pthread_mutex_unlock( &lattice_mutex );
}
線程2:
if(newData) {
renderUpdate();
pthread_mutex_lock( &lattice_mutex );
newData = FALSE;
pthread_mutex_unlock( &lattice_mutex );
}
這是從您的第一個版本派生的-它稍微簡單一些。
pthread_mutex_lock(&lattice_mutex);
if (!newData) {
pthread_mutex_unlock(&lattice_mutex); // Omit?
uchar *lattice_pos = lattice;
int i;
for (i = 0; i < size; i++)
*lattice_pos++ = rand() % CHAR_MAX;
pthread_mutex_lock(&lattice_mutex); // Omit?
newData = TRUE;
}
pthread_mutex_unlock(&lattice_mutex);
pthread_mutex_lock(&lattice_mutex);
if (newData) {
pthread_mutex_unlock(&lattice_mutex); // Omit?
renderUpdate();
pthread_mutex_lock(&lattice_mutex); // Omit?
newData = FALSE;
}
pthread_mutex_unlock(&lattice_mutex);
這完全取決於要使用的晶格信息的方式,但是給定互斥鎖的名稱,我認為在修改晶格時應將其保持鎖定狀態,因此有兩對標記為“ Omit?”的行。 應該刪除。 否則,將無法保護晶格免受並發訪問。
補充:我認為第二個版本是錯誤的-它不能正確地保護晶格。
第一個版本是正確的,在寫入和讀取時都需要互斥體。
但是,對於AFAIK,幾乎所有的體系結構都可以對原子的一個數據單元(例如int)進行簡單的讀寫訪問。 但是,請注意,在內存順序較弱的體系結構上,您可能會遇到諸如在緩沖區實際包含數據之前看到“ buffer-full”標志為true的問題。
請注意,代碼可能不是您能做的最好的事情,因為它永遠不會休眠(使用繁忙的等待)。 如果要等待任一線程中的數據,則必須將條件變量與互斥鎖一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.