كيف يمكنني قراءة / كتابة متغير المشتركة مع بثريدس؟

StackOverflow https://stackoverflow.com/questions/607374

  •  03-07-2019
  •  | 
  •  

سؤال

ولقد اثنين من المواضيع، وذلك باستخدام بثريدس C على لينكس. واحد منهم يكتب البيانات والآخر قراءته. أنا باستخدام متغير للسماح للموضوع القراءة عندما يسمح للقراءة والكتابة واحد عندما يسمح. لذلك مزامنة ينطبق على هذا المتغير منطقية تسمى "newData". سؤالي هو: هل أنا بحاجة لقفل / فتح مزامنة حول المداخل داخل "إذا" الشرط؟ في كلا الاتجاهين العمل، ولكن أعتقد أنه فقط من فرص تداخل الكتابة / القراءة على هذا المتغير قليلة جدا. تبين لي كلا البديلين لشرح أفضل سؤالي:

والموضوع 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);

وهذا يعتمد على بالضبط كيف هو المقصود المعلومات شعرية لاستخدامها، ولكن نظرا للاسم كائن مزامنة، أعتقد أن عليك أن يبقيه مؤمن بينما كنت تعديل شعرية، وبالتالي أزواج اثنين من خطوط ملحوظ "حذفت؟ يجب ازلته. خلاف ذلك، وشعرية ليست محمية من الوصول المتزامن.

وأضاف: أعتقد أن النسخة الثانية خاطئ - أنه لا يحمي بشكل صحيح شعرية

نصائح أخرى

والنسخة الأولى هو الصحيح، كنت في حاجة إلى مزامنة على كل من يكتب ويقرأ.

ولكن، AFAIK، جميع البنى تقريبا كانت هناك قراءة بسيطة والكتابة بالوصول إلى وحدة واحدة من البيانات (على سبيل المثال. المترجم) الذري. ومع ذلك، لاحظ أن على أبنية مع ضعف الطلب الذاكرة، قد تكون لديكم قضايا مثل رؤية العلم "العازلة-كامل" إلى true قبل المخزن المؤقت يحتوي فعلا على البيانات.

لاحظ أن رمز ربما لا يكون أفضل ما يمكن القيام به، لأنه لا تنام (يستخدم الانتظار مشغول). إذا أردت أن تنتظر للبيانات في أي موضوع، سيكون لديك لاستخدام متغير حالة مع مزامنة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top