LINUX.ORG.RU

Треды и segfault


0

0

Есть код демона, который вынужден сопровождать. Внезапно, как и всегда бывает, демон стал падать по segfault. Выяснилось место появления segmentatin fault, структура кода такая:

int g_finished;

static void *thr1(void *data)
{
    while (!g_finished) {
     ...
    }

    return NULL;
}

static void *thr2(void *data)
{
    while (!g_finished) {
     ...
    }

    return NULL;
}

static void *thr3(void *data)
{
    while (!g_finished) {
    ...
    }

    return NULL;
}

static void *thr4(void *data)
{
    InitPollingJob();

    while (!g_finished) {
    ...
    }

    return NULL;
}

int main(void)
{
    pthread_create(&tid1, NULL, &thr1, NULL);
    pthread_create(&tid2, NULL, &thr2, NULL);
    pthread_create(&tid3, NULL, &thr3, NULL);
    ...

    pthread_create(&tid4, NULL, &thr4, NULL);
    ...

    while (! g_finished) {  /* точка segmentation fault */
      ....
    }

    return 0;
}

Переменная g_finished нигде не защищена мьютексами. Возможно ли что приложение падает именно по этой причине? Но тогда как оно работало продолжительное время без проблем?

★★

Попробуй в конце main подождать завершения всех потоков

ttnl ★★★★★
()

Прямо по этой причине падать не может, больше похоже на переполнение буфера внутри while (! g_finished) { ... }

mikki
()

Так вернее:

volatile int g_finished;

Тоже думаю, что segfault не там, где ты показываешь.

Pavval ★★★★★
()

Из этого кода ничего не видно. Либо выкладывай всё, либо напиши минимальный код, который тоже будет сегфолтить предположительно по этой же причине.

anonimusnax
()

Проверяем флаг на выход, зачем его защищать мютексами? Вполне нормальный код, падать тут не может.

Reset ★★★★★
()
Ответ на: комментарий от Reset

Только без volatile компилятор может дать проблемы.

Pavval ★★★★★
()
Ответ на: комментарий от pathfinder

Достоверные сведения?

Прямо по этой причине падать не может, больше похоже на переполнение буфера внутри while (! g_finished) { ... }

закомментаривание всего while (!g_finished) «фиксит» проблему. Если оставить while (!g_finished) с пустым телом, то падает.

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

Собирай с gcc -O0 -fno-inline -g и смотри на достоверное место падения. Из-за одновременного чтения интовой переменной падения происходить не может.

linuxfan
()
Ответ на: комментарий от cruz7

>>закомментаривание всего while (!g_finished) «фиксит» проблему. Если оставить while (!g_finished) с пустым телом, то падает.

Не может это быть из-за того, что проблема падения все-таки в каком-то треде, и когда ты комментишь пустой цикл, то программа завершается вместе с тредами и они не успевают сегфолтнуть твою прогу?

MuZHiK-2 ★★★★
()
Ответ на: комментарий от MuZHiK-2

А действительно. падает небось какой-то другой тред, а основной поток просто крутится в цикле и постоянно показывает while (!g_finished) как точку исполнения.

Где в момент сегфолта другие потоки?

Pavval ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.