簡體   English   中英

如何使用pthreads讀取/寫入共享變量?

[英]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 );
}

這是從您的第一個版本派生的-它稍微簡單一些。

線程1:作家

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);

線程2:讀者

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM