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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогие с потоками 
:(
    Опции темы
IoganeGambaPuti
  Дата 22.1.2009, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго вечера!
Есть простой код:
Код

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
class A {
public:
int mem;
A(int _mem) {
       mem=_mem;
       std::cout<<"constructed:"<<mem<<std::endl;
       }
  ~A() {std::cout<<"destructed"<<std::endl;}
};

void* thread1_body(void* param)
{
A a(1);
std::cout<<"I`ll go sleep"<<std::endl;
sleep(5);
pthread_exit((void*)a.mem);
return (void*)a.mem;
}

void* thread2_body(void* param2)
{
A b(2);
pthread_t thread1;
pthread_create(&thread1,NULL,&thread1_body,NULL);
std::cout<<"Real sleep?"<<std::endl;
pthread_join(thread1,NULL);
pthread_exit((void*)b.mem);
return (void*)b.mem;
}

int main() 
{
pthread_t thread2;
pthread_create(&thread2,NULL,&thread2_body,NULL);
pthread_detach(thread2);
return 0;
}


После компиляции: $ g++ -lpthreadth -o my_sample.o my_sample.c ,запускаю my_sample.o и вот что получаю в терминале:
Код

constructed:2
constructed:1
I`ll go sleep


а отладчик gdb вообще выдаёт:
Код

Starting program: my_sample.o 
[Thread debugging using libthread_db enabled]
[New Thread 0xb7d0d8d0 (LWP 14528)]
[New Thread 0xb7d0cb90 (LWP 14531)]
constructed:2

Program exited normally.



Почему так?И почему дестукторы не срабатывают?Ведь thread2 ожидает завершение thread1 и после этого поидее все локальные переменные thread1 должны уничтожиться(т е объект "a").И почему не отрабатывает функция pthread_detach(thread2),ведь она должна очистить локальные переменные потока thread2.
PM MAIL   Вверх
baldina
Дата 23.1.2009, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

pthread_exit(...);

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

Добавлено через 1 минуту и 50 секунд
Цитата

И почему не отрабатывает функция pthread_detach(thread2),ведь она должна очистить локальные переменные 

ничего никому она не должна. она вообще не в курсе, что у тебя - C++ со своими с объектами, деструкторами и т.д.

Добавлено через 3 минуты и 34 секунды
Цитата

Код

pthread_exit((void*)a.mem);
return (void*)a.mem;


это масло масляное. обе строчки делают одно и то же. только до второй не доходит никогда.

PM MAIL   Вверх
IoganeGambaPuti
Дата 23.1.2009, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



OK
1)а почему тогда отладка в gdb и простой запуск кода отличаются?
2)и почему деструкторы не отрабатывают,у меня потоки завершаются же до завершения процесса main и поидее их стэк очищается,т е
 объекты a и b разрушаются?Если нет.то подскажи,пожалуйсто,как надо. 
PM MAIL   Вверх
baldina
Дата 23.1.2009, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

стэк очищается


очистка стека - просто изменение указателя вершины стека. вызов деструкторов встраивается компилятором в точке выхода из функции. А здесь выход происходит совершенно другим образом. я же написал уже выше...

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

Цитата

При компиляции программ на С++ некоторыми версиями компиляторов (наиболееизвестны проблемы такого рода с GCC, но проблемы есть и у некоторых коммерческихкомпиляторов), при завершении нити вызовом pthread_exit(3C) не вызываютсядеструкторы локальных переменных. Информацию об этом не всегда удается найти вдокументации. В действительности это определяется не столько версией компилятора,сколько опциями при сборке компилятора и особенностями Cruntime/libpthread.Так, компилятор Sun Studio 11 вызываетдеструкторы, а GCC 3.4.3, входящий в поставкуSolaris 10 – не вызывает.GCC 2.95.4 в Debian Woody не вызывает деструкторы, GCC 3.3.5 в Debian Sarge –вызывает.Intel C++ Compiler 7.1 при работе на Debian Woody невызывает деструкторы


Добавлено через 2 минуты и 17 секунд
Цитата

как надо


Цитата

вообще не нужен pthread_exit()


оставь просто return.

Цитата

Для завершения нити используется функция pthread_exit(3C). Эта функция всегда завершаетсяуспешно и принимает единственный параметр, указатель на код возврата типа void * . Как и вслучае с pthread_create(3C), библиотека никогда не пытается обращаться к значению этогопараметра как к указателю, поэтому его можно использовать для передачи скалярныхзначений.Другой способ завершениянити – это возврат управления из функции start_routineпри помощиоператора return. 


PM MAIL   Вверх
IoganeGambaPuti
Дата 23.1.2009, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо разобрался.Кстати цитаты из тех же лекций по которым я разбираюсь smile 
Если кто зайдёт с гугла или форумчани вот по многопоточности,хорошая вещь:
http://ru.sun.com/research/materials/Irtegov_Tech.html
Тема закрыта.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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