Мой код (см. Ниже) вызывает странное поведение. Выход:pthread_join, похоже, меняет мой индекс цикла
Testing whether there are problems with concurrency ...rc is 0. i is 0
.rc is 0. i is 0
.rc is 3. i is 1
.rc is 0. i is 0
.rc is 3. i is 1
.rc is 3. i is 2
.rc is 0. i is 0
.rc is 3. i is 1
.rc is 3. i is 2
.rc is 3. i is 3
.rc is 0. i is 0
.rc is 3. i is 1
.rc is 3. i is 2
.rc is 3. i is 3
.rc is 3. i is 4
.rc is 0. i is 0
Segmentation fault (core dumped)
Я пытался отладить ее, но только узнал, что я сброшен в 0, сразу после pthread_join. Это приводит меня к выводу, что модификация должна произойти где-то там. Но я ничего не могу найти. Я чувствую себя глупо, потому что это не очень сложный код. Что я не заметил?
Операционная система Ubuntu 14.04. N_THREADS в настоящее время установлен на 10, N_RUNS 10000.
Главная нить:
pthread_t threads[N_THREADS];
pthread_attr_t attr;
int i;
int rc;
int status;
printf("Testing whether there are problems with concurrency ...");
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
for (i = 0; i < N_THREADS; i++){
if (i) {
rc = pthread_create(&(threads[i]), &attr, addRemove, 0);
} else {
rc = pthread_create(&(threads[i]), &attr, readStuff, 0);
}
if (rc) return rc;
}
for(i = 0; i < N_THREADS; i++) {
rc = pthread_join(threads[i], (void*) &status);
// if(rc == 3)
printf("rc is %d. i is %d\n", rc, i);
// if (rc) return rc;
if (status) return status;
printf(".");
}
pthread_attr_destroy(&attr);
return 0;
Рабочие потоки:
void* readStuff(void* a)
{
int i;
for (i = 0; i< N_RUNS; i++){
;
}
pthread_exit((void*)0);
}
void* addRemove(void* a)
{
int i;
for (i = 0; i< N_RUNS; i++){
;
}
pthread_exit((void*)0);
}
Там нет других нитей, кроме основного потока, и те, созданные в код выше.
у вас есть две петли для соединения в части соединения. Это опечатка? – KiaMorot
есть. Просто исправил это. – Martze
Как получить полный, компилируемый пример? http://sscce.org/ – davmac