0

私はこのコードを持っています。ここでは、グローバル変数 c の使用を同期する必要がありますか? ストリームが同時に動作を開始し、1 つのスレッドが別のスレッドの結果を上書きして、最終的に 2 または 7 を取得することは可能ですか?

#include <iostream>
#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h>

int c = 0;

void* write(void*)
{
    c += 2;
}

void* read(void*)
{
    c += 7; 
}

int main()
{
    pthread_t t1;
    pthread_t t2;

    std::cout << "first C = " << c << std::endl;
    int r1 = pthread_create(&t1, 0, &write, 0);
    int r2 = pthread_create(&t2, 0, &read, 0);
    pthread_join(t1, 0);
    pthread_join(t2, 0);
    std::cout << " C = " << c << std::endl;

    return 0;
}
4

3 に答える 3

0

SMP マシン (個別のデータ キャッシュ メモリを使用) では、もう 1 つ微妙な考慮事項があります。それは、スレッド間メモリ同期です。スレッドが異なるコア/CPU で実行されている場合、2 つのスレッドの更新cがまったく同時に実行されなくても、別のスレッドからのメモリの更新がすぐに認識されない可能性があります。たとえば、を使用pthread_mutex_tして同期すると、この問題に対処できます。

メモリを他のスレッドとpthread_join()同期するため、スレッドに参加した後c、更新された値で表示されることを保証するために追加の対策は必要ありません。

他のスレッドとのメモリ同期を提供することが保証されている POSIX スレッド関数のリストを次に示します: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11

于 2013-11-06T03:17:42.313 に答える