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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> std::thread. Проверить завершился ли поток. 
:(
    Опции темы
Fifizuzu
Дата 8.3.2013, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как проверить завершился ли поток std::thread?
PM MAIL   Вверх
Dem_max
Дата 9.3.2013, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



joinable() ??????


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Fifizuzu
Дата 9.3.2013, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Dem_max @ 9.3.2013,  07:36)
joinable() ??????

Код

#include <thread>
#include <cstdlib>

void f1()
{
}

void f2()
{
    for (;;)
    {
    }
}

int main()
{
    std::thread t1(f1);
    std::thread t2(f2);

    clock_t c = clock();
    while (clock() - c < 1000);

    bool b1 = t1.joinable(); // true
    bool b2 = t2.joinable(); // true
}


Это сообщение отредактировал(а) Fifizuzu - 9.3.2013, 13:47
PM MAIL   Вверх
Dem_max
Дата 9.3.2013, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

    bool b1 = t1.joinable(); // true
    bool b2 = t2.joinable(); // true


все верно потоки у тебя работают поэтому true и возвращают

http://en.cppreference.com/w/cpp/thread/thread/joinable

Это сообщение отредактировал(а) Dem_max - 9.3.2013, 17:27


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
borisbn
Дата 9.3.2013, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

#include <thread>
#include <cstdlib>
#include <iostream>
void f1()
{
}
void f2()
{
    for (;;)
    {
    }
}

class ThreadWrap
{
public:
    template< class F >
    ThreadWrap( F f )
        : m_finished( false ), m_thread( &ThreadWrap::run< F >, this, f )
    {
    }
    bool finished() const { return m_finished; }
private:
    bool m_finished;
    std::thread m_thread;
    template< class F >
    void run( F f ) {
        f();
        m_finished = true;
    }
};
int main()
{
    ThreadWrap w1( f1 );
    ThreadWrap w2( f2 );
    clock_t c = clock();
    while (clock() - c < 1000) /*std::this_thread::yield()*/;
    std::cout << w1.finished() << std::endl;
    std::cout << w2.finished() << std::endl;
}

http://liveworkspace.org/code/rM3sL$10

Это сообщение отредактировал(а) borisbn - 9.3.2013, 21:41


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
feodorv
Дата 9.3.2013, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



borisbn, нормальное решение, подходящее для большинства случаев. Однако если функция потока находится в отсоединяемой от процесса DLL, я бы не рискнул его применять (так как нет никакой гарантии, что поток уже окончательно завершился даже при finished() == true).


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
borisbn
Дата 9.3.2013, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



feodorv, хммм... не понял... а что значит 
Цитата(feodorv @  9.3.2013,  23:34 Найти цитируемый пост)
находится в отсоединяемой от процесса DLL
 ? и чем это чревато ?



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
feodorv
Дата 9.3.2013, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(borisbn @  10.3.2013,  00:36 Найти цитируемый пост)
и чем это чревато ?

Тем что между m_finished = true; и } есть команды процессора, выполняющиеся в рамках созданного потока. Если другой поток, проверив finished(), решит, что DLL можно отсоединять, то существует вероятность, что DLL уже будет отсоединена от процесса, а якобы завершившемуся потоку нужно будет выполнить ещё несколько команд (находящихся уже в недействительной памяти процесса, что приведёт к нарушению доступа).

Прошу прощения, не заметил вопроса:
Цитата(borisbn @  10.3.2013,  00:36 Найти цитируемый пост)
feodorv, хммм... не понял... а что значит 

Я имел в виду, что к процессу может быть динамически присоединена DLL, экспортирующая некоторую функцию, которая затем будет использована в качестве функции потока.

Это сообщение отредактировал(а) feodorv - 9.3.2013, 23:56


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
borisbn
Дата 10.3.2013, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



feodorv, ясно. Спасибо. Насколько я понимаю, это справедливо не только для DLL, но и просто для памяти, выделенной через new. Для моего примера:
Код

ThreadWrap * w1 = new ThreadWrap( f1 );
...
If (w1->finished())
    delete w1; // !!! плохо


Так?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Dem_max
Дата 10.3.2013, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Просто std::thread это какой то недоделанный костыль


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
feodorv
Дата 10.3.2013, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(borisbn @  10.3.2013,  08:53 Найти цитируемый пост)
Так? 

Похожая ситуация, только здесь возможен незапланированный вызов terminate()...

Цитата(Dem_max @  10.3.2013,  13:53 Найти цитируемый пост)
Просто std::thread это какой то недоделанный костыль

Хорошо хоть так сделали, хотя и есть ощущение недоделанности.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Fifizuzu
Дата 10.3.2013, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если код потока завершается, поток продолжает жить?
Я хочу сделать многопоточность для сервера. Хотелось бы пример.
PM MAIL   Вверх
Dem_max
Дата 11.3.2013, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Если код потока завершается, поток продолжает жить?

Да потоку нужно очистить ресурсы, которые он занял.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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