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

Поиск:

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

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



Здравствуйте!

В винде есть такие функции:
Код

SuspendThread
ResumeThread


соответственно приостановка/запуск потока. А возможно ли такое реализовать в никсах?  smile 

Спасибо за внимание!

ЗЫ Вот попробовал такой код:
Код

    typedef pthread_t        thread_id;
    typedef pthread_mutex_t    mutex_id;
    typedef sem_t            semaphore_id;
    typedef void * ( * thread_func )( void * );

#define THREAD_FUNCTION_PROTOTYPE( func, arg ) void * func( void * arg )



namespace eng
{

    mutex_id create()
    {
#ifdef _WIN32
        mutex_id res = CreateMutexW( NULL, false, NULL );
        return res;
#else
        mutex_id res;
        pthread_mutex_init( &res, NULL );
        return res;
#endif
    }

    void destroy( mutex_id & mutex )
    {
        if ( valid( mutex ) )
        {
#ifdef _WIN32
            CloseHandle( mutex );
            mutex = NULL;
#else
            pthread_mutex_destroy( &mutex );
#endif
        }
    }

    bool lock( mutex_id & mutex )
    {
        if ( valid( mutex ) )
        {
#ifdef _WIN32
            return WaitForSingleObject( mutex, INFINITE ) == WAIT_OBJECT_0;
#else
            return pthread_mutex_lock( &mutex ) == 0;
#endif
        }
        else return false;
    }

    bool unlock( mutex_id & mutex )
    {
        if ( valid( mutex ) )
        {
#ifdef _WIN32
            return ReleaseMutex( mutex );
#else
            return pthread_mutex_unlock( &mutex ) == 0;
#endif
        }
        else return false;
    }

    bool valid( mutex_id mutex )
    {
#ifdef _WIN32
        return mutex != NULL;
#else
        return true;
#endif
    }


    thread_id create( thread_func func, void * data )
    {
#ifdef _WIN32
        thread_id res = CreateThread( NULL, 0, func, data, 0, NULL );
        return res;
#else
        thread_id res;
        pthread_create( &res, NULL, func, data );
        return res;
#endif
    }

    bool suspend( thread_id thread )
    {
        if ( valid( thread ) )
        {
#ifdef _WIN32
            return SuspendThread( thread ) != 0xffffffff;
#else
            return pthread_cancel( thread ) == 0;
#endif
        }
        else return false;
    }

    bool resume( thread_id thread )
    {
        if ( valid( thread ) )
        {
#ifdef _WIN32
            return ResumeThread( thread ) != 0xffffffff;
#else
            //
            return true;
#endif
        }
        else return false;
    }

    void * wait( thread_id thread )
    {
        if ( valid( thread ) )
        {
#ifdef _WIN32
            DWORD res;
            WaitForSingleObject( thread, INFINITE );
            GetExitCodeThread( thread, &res );
            return ( void * )res;
#else
            void * res;
            pthread_join( thread, &res );
            return res;
#endif
        }
        else return 0;
    }

    bool valid( thread_id thread )
    {
#ifdef _WIN32
        return thread != NULL;
#else
        return pthread_kill( thread, 0 ) == 0;
#endif
    }

}


////////////////////////////////////////////////

eng::mutex_id mut;

THREAD_FUNCTION_PROTOTYPE( func, arg )
{

    printf( "start\n" );
    fflush( stdout );
    eng::lock( mut );
    eng::unlock( mut );
    printf( "finish\n" );
    fflush( stdout );
    
}

int main( int argc, char * argv[] )
{
    
    mut = eng::create();
    
    eng::lock( mut );
    eng::thread_id thread = eng::create( &func, NULL );
    eng::suspend( thread );
    eng::unlock( mut );
    
    sleep( 5 );
    
    getchar();
    
    //eng::resume( thread );
    eng::wait( thread );
    
    
    eng::destroy( mut );
    
    return 0;
}


Так вот, по-видимому я неправильно делаю приостановку. Оно работает так:
start
*ждёт 5 сек.*
finish
*ждёт ввода*

Такое чувство, что после 5 секунд поток самопроизвольно запустился.
Я ожидал либо (не приостановился):
start
finish
*ждёт 5 сек.*
*ждёт ввода*

либо (приостановился):
start
*ждёт 5 сек.*
*ждёт ввода*

Это сообщение отредактировал(а) CPlusPlusFAN - 12.11.2009, 17:50
PM MAIL ICQ Jabber   Вверх
niXman
Дата 12.11.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Незнаю что за код ты пробовал, лень читать. Но то что тебе нужно реализуется мьютексками и "wait condition"-ами
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
Alca
Дата 12.11.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Classes.pas (VCL):
Цитата

{$IFDEF LINUX}
{
  About Suspend and Resume. POSIX does not support suspending/resuming a thread.
  Suspending a thread is considerd dangerous since it is not guaranteed where the
  thread would be suspend. It might be holding a lock, mutex or it might be inside
  a critical section.  In order to simulate it in Linux we've used signals. To
  suspend, a thread SIGSTOP is sent and to resume, SIGCONT is sent. Note that this
  is Linux only i.e. according to POSIX if a thread receives SIGSTOP then the
  entire process is stopped. However Linux doesn't entirely exhibit the POSIX-mandated
  behaviour. If and when it fully complies with the POSIX standard then suspend
  and resume won't work.
}



--------------------
PM WWW ICQ Skype Jabber   Вверх
niXman
Дата 12.11.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Alca, Спасибо, просветил.
Только не понимаю, какое отношение к этому имеет "Classes.pas (VCL)" ?
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
Alca
Дата 12.11.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Это от туда  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
niXman
Дата 12.11.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Парадокс)
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
Wolf
Дата 21.4.2010, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, ценная цитата из VCL. Там оказывается много цитат на свободные темы  smile  (Извеняюсь за оффтоп) На самом деле они разрабатывали крос платформенный VCL (CLX вроде). А вот что делать в этом случае:

Цитата

Note that this
  is Linux only i.e. according to POSIX if a thread receives SIGSTOP then the
  entire process is stopped. However Linux doesn't entirely exhibit the POSIX-mandated
  behaviour. If and when it fully complies with the POSIX standard then suspend
  and resume won't work.


К сожалению, так и происходит. По SIGSTOP  останавливается весь процесс.
PM MAIL ICQ   Вверх
Alca
Дата 6.5.2010, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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





--------------------
PM WWW ICQ Skype Jabber   Вверх
djamshud
Дата 6.5.2010, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>Остановка потоков (SuspendThread) в режиме ядра

Какое это имеет отношение к UNIX?

Поток заморозить нельзя. Можно либо, как выше предлагали, вставить в цикл треда мутекс, который сможет приостановить выполнение до последующей разблокировки. Либо, что более верно на мой взгляд, форкнуться или запустить другой вспомогательный процесс, а им уже управлять, как душе угодно.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
proc_maker
Дата 14.9.2010, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я бы посоветовал спячку на семафоре (на условной переменной). Есть возможность и спать с таймаутом и постоянно пока не разбудят:

pthread_cond_wait
pthread_cond_timedwait

Это сообщение отредактировал(а) proc_maker - 14.9.2010, 12:16
PM MAIL ICQ Skype   Вверх
JackYF
Дата 17.9.2010, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Тупой вариант:
Цитата

sleep() makes the calling thread sleep until seconds seconds have elapsed or a signal arrives which is not ignored.


Хороший вариант: см пост proc_maker.


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

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

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


 




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


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

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