Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки в с++, учусь работать с потоками 
:(
    Опции темы
XaverOz
Дата 9.3.2011, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.3.2011

Репутация: нет
Всего: нет



Учусь работать с потоками на линуксовом с++. Решил написать тестовую программу устроена следующим образом: существует класс при создании объекта класса происходит запуск потока который все время в бесконченом цикле увеличивает значение переменной если значение больше 532, переменная становится равна 0, так же в классе есть метод который позволяет получить значение этой переменной. Для организации взаимного исключения использовались мьютексы.
Код

class Devemu {
    int VarInc;
    pthread_t thread_id;
    pthread_mutex_t inc_mutex;
    
    void Increm() {
        for(;;) {
            pthread_mutex_lock(&inc_mutex);
            if (VarInc > 532) VarInc = 0;
            VarInc++;
            pthread_mutex_unlock(&inc_mutex);
        }
    }

public:
    static void* IncWrapper(void* thisPtr) {
        ((Devemu*) thisPtr)->Increm();
        return NULL;
    }
    Devemu() {
        VarInc = 0;
        pthread_mutex_init(&inc_mutex, NULL);
        pthread_create(&thread_id, NULL, &Devemu::IncWrapper, NULL);
    }
    int Var() {
        int i;
        pthread_mutex_lock(&inc_mutex);
        i =  VarInc;
        pthread_mutex_unlock(&inc_mutex);
        return i;
    }
}; 

int main(int argc, char** argv) {

    Devemu* em = new Devemu();
    int i = 0;
    for(; i < 35; i++) {
        printf("%d\n", em->Var());
    }
    return (EXIT_SUCCESS);
}


Данный код возвращает ошибку сегментации не могу понять почему

PM MAIL   Вверх
azesmcar
Дата 9.3.2011, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Цитата(XaverOz @  9.3.2011,  21:46 Найти цитируемый пост)
Данный код возвращает ошибку сегментации не могу понять почему

потому-что аргументом в поток передается NULL вместо this.
PM   Вверх
XaverOz
Дата 9.3.2011, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.3.2011

Репутация: нет
Всего: нет



Предлагаете переделать вот так?
Код

Devemu() {
        VarInc = 0;
        pthread_mutex_init(&inc_mutex, NULL);
        pthread_create(&thread_id, NULL, &Devemu::IncWrapper, this);
    }


Это сообщение отредактировал(а) XaverOz - 9.3.2011, 22:10
PM MAIL   Вверх
azesmcar
Дата 9.3.2011, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Цитата(XaverOz @  9.3.2011,  22:10 Найти цитируемый пост)
Предлагаете переделать вот так?

Да.
Не уверен, что это единственная ошибка, но во всяком случае пока что это попалось на глаза.

Это сообщение отредактировал(а) azesmcar - 9.3.2011, 22:35
PM   Вверх
fish9370
Дата 10.3.2011, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



ну вообще поток перед выходом нужно прибить.. используя pthread_cancel() или вставить в цикл проверку на завершение и дождаться пока он сам умрет с помощью pthread_join()

а потом выходить..

Это сообщение отредактировал(а) fish9370 - 10.3.2011, 10:46


--------------------
undefined
PM MAIL WWW ICQ   Вверх
fish9370
Дата 10.3.2011, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



да и мютекс выделеный динамически нужно освобождать функцией pthread_mutex_destroy()..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
XaverOz
Дата 10.3.2011, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.3.2011

Репутация: нет
Всего: нет



спасибо заработало 
PM MAIL   Вверх
boostcoder
Дата 10.3.2011, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(fish9370 @  10.3.2011,  10:36 Найти цитируемый пост)
поток перед выходом нужно прибить.. используя pthread_cancel()

не нужно.
PM WWW   Вверх
fish9370
Дата 10.3.2011, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(boostcoder @  10.3.2011,  16:16 Найти цитируемый пост)
не нужно


не уверен, что это безопасно.. прошу аргументированный ответ..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 10.3.2011, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(fish9370 @  10.3.2011,  17:38 Найти цитируемый пост)
прошу аргументированный

RTFM smile 
PM WWW   Вверх
fish9370
Дата 10.3.2011, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



boostcoder, ты в вопросе не разбираешься.. ты бы хоть сказал на какой ман ты ссылаешься.. 

Это сообщение отредактировал(а) fish9370 - 10.3.2011, 21:22


--------------------
undefined
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 10.3.2011, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(fish9370 @  10.3.2011,  21:20 Найти цитируемый пост)
ты в вопросе не разбираешься.

раз уж ты так сказал, значит так и есть smile
PM WWW   Вверх
fish9370
Дата 10.3.2011, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(boostcoder @  10.3.2011,  21:49 Найти цитируемый пост)
раз уж ты так сказал, значит так и есть


я мог бы и промолчать, но это и без того видно.. ты воздух сотрясаешь, а по делу тебе сказать нечего.. мое мнение..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 10.3.2011, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(fish9370 @  10.3.2011,  22:21 Найти цитируемый пост)
ты воздух сотрясаешь, а по делу тебе сказать нечего

ну... это самый весомый аргумент. даже не поспоришь smile 
PM WWW   Вверх
fish9370
Дата 10.3.2011, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(boostcoder @  10.3.2011,  22:23 Найти цитируемый пост)
ну... это самый весомый аргумент. даже не поспоришь 


может, ты все-таки перестанешь умничать, и что-то ответишь?

напаминаю вопрос:

почему ты считаешь, завершение главного потока, без завершения дочерних потоков, безопасным?


Это сообщение отредактировал(а) fish9370 - 10.3.2011, 22:32


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.