سؤال

على افتراض لدي برنامج C مع 3 POSIX المواضيع وتبادل عالمي متغير, مزامنة, و حالة متغير ، اثنتان منها تنفيذ ما يلي psuedocode:

...process data...
pthread_mutex_lock( &mutex );
variable = data_ptr;
pthread_cond_signal( &cond );
pthread_mutex_unlock( &mutex );

والثالث تشغيل:

while(1) {
    while( variable == NULL ) {
        pthread_mutex_wait( &cond, &mutex );
    }
    printf( "Data is %d", *variable );
}

هو الأسلم أن نفترض أن الموضوع الثالث سوف ترى البيانات من كل من الأولين ؟

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

هل كانت مفيدة؟

المحلول

وليس هناك شيء مثل pthread_mutex_wait. أفترض أنك تعني:

pthread_mutex_lock(&mutex);
/* ... */
while (1) {
  while (variable == NULL)
    pthread_cond_wait(&cond, &mutex);
  printf("Data is %d", *variable);
}
/* ... */
pthread_mutex_unlock(&mutex);

وليس هناك جوارينتي أن موضوع الثالث ستشهد البيانات من كليهما. سوف pthread_cond_signal إيقاظ موضوع الثالث، ولكن قد لا تأخذ مزامنة فورا. واحدة من الكتاب الآخرين قد تأخذ مزامنة أولا. ومع ذلك يمكنك acheive ما تريد مع العمل أكثر قليلا:

void put(int *p) {
  pthread_mutex_lock(&mutex);
  while (variable)
    pthread_cond_wait(&cond_empty, &mutex);
  variable = p;
  pthread_cond_signal(&cond_full);
  pthread_mutex_unlock(&mutex);
}

int *get() {
  int *ret;

  pthread_mutex_lock(&mutex);
  while (!variable)
    pthread_cond_wait(&cond_full, &mutex);
  ret = variable;
  variable = NULL;
  pthread_cond_signal(&cond_empty);
  pthread_mutex_unlock(&mutex);

  return ret;
}

حسب انتظار صراحة للمتغير يمكن ان تقرأ، نتجنب حالة تعارض محتملة.

نصائح أخرى

هنا هو ما وجدته في القياسية:

4.13 سياسة الجدولة

جدولة سياسة يؤثر على عملية أو موضوع الطلب:

[...]

  • عند عملية أو موضوع هو الممنوع الموضوع و يصبح runnable الموضوع

مطابقة التنفيذ تحدد الطريقة التي كل من جدولة سياسات تعديل الأولويات أو غير ذلك يؤثر على ترتيب العمليات أو المواضيع في كل من الحوادث المذكورة أعلاه.بالإضافة إلى ذلك, تتفق مع تطبيقات تحدد في أي ظروف أخرى و بطريقة ما كل سياسة الجدولة تعديل الأولويات أو تؤثر على ترتيب العمليات أو المواضيع.

حتى انها على ما يبدو غير معروف.فإنه ليس من المستغرب:عموما, لا يمكنك أن تفترض أي شيء عن الذي runnable الموضوع سيتم تحديد موعد لتشغيل.

ووفقا لmanpage pthread_cond_wait

<اقتباس فقرة>   

والخيط (ق) التي هي الافراج يجب مواجهتها لمزامنة وفقا لسياسة الجدولة (إن وجدت)، وكما لو أن كل دعت pthread_mutex_lock ().

ومما يؤسف له بقدر ما استطيع ان اقول، لا توجد سياسة جدولة المتاحة والتي تمنحك السلوك الذي تريده.

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