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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача управления следующему потоку FreeBSD 
V
    Опции темы
Wolf
Дата 28.8.2010, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток! Каким образом во FreeBSD управление можно передать другому (следующиму) потоку?

Вот скажем есть у меня бесконечный цикл:

Код

while (true) {
     ...
    
     //Вот тут требуется вставить вункцию, которая
     //дала операционной системе понять, что
     //нужно обслуживать следующий поток, а
     //этот подождёт.
}

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


pattern`щик
****


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

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



Цитата(Wolf @  28.8.2010,  15:02 Найти цитируемый пост)
передать другому (следующиму) потоку?

не уверен что правильно понял вас...

вам нужно выполнение какой-то функции распределять между потоками?

если да, то так:
Код

#include <iostream>
#include <boost/thread.hpp>

void somefunction(int arg) {
   std::cout << "somefunction(" << arg << ")" << std::endl;
}

int main() {
   const size_t cores = 4;
   boost::thread_group threads;
   
   for ( size_t idx = 0; idx < cores; ++idx ) {
      threads.create_thread(boost::bind(somefunction, rand()));
   }
   
   threads.join_all();
   
   return 0;
}

это простой вариант. в нем возможно создание слишком многого кол-ва потоков. за этим нужно следить самому.
суть в том, что просто создаются потоки, кол-во которых, можете задавать произвольно. шедулер ОС сам распределит их.
потоки сами будут удаляться тогда, когда вернется управление из somefunction().

правильный вариант - использовать boost::asio::io_service в связке с boost::thread_group.

Это сообщение отредактировал(а) boostcoder - 28.8.2010, 16:14
PM WWW   Вверх
MAKCim
Дата 28.8.2010, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Wolf
sched_yield

Добавлено через 1 минуту и 25 секунд
boostcoder
я вообще не понимаю, зачем приводить такие примеры?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


pattern`щик
****


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

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



Цитата(MAKCim @  28.8.2010,  16:34 Найти цитируемый пост)
такие

какие?
PM WWW   Вверх
MAKCim
Дата 28.8.2010, 23:05 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



boostcoder
у автора даже намека нет на использование boost'а
это раз (да и вообще, в этом разделе форума советовать boost как-то не кошерно, имхо)
во-вторых, если не поняли вопрос, уточните
смысл телепатии с не имеющим отношения к сути вопроса кодом?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


pattern`щик
****


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

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



Цитата(MAKCim @  28.8.2010,  23:05 Найти цитируемый пост)
у автора даже намека нет на использование boost'а

а это что ,что-то из ряда вон выходящее?

Цитата(MAKCim @  28.8.2010,  23:05 Найти цитируемый пост)
во-вторых, если не поняли вопрос, уточните

я и предположил, что возможно не верно понял задачу..
Цитата(boostcoder @  28.8.2010,  16:04 Найти цитируемый пост)
не уверен что правильно понял вас...



Цитата(MAKCim @  28.8.2010,  23:05 Найти цитируемый пост)
смысл телепатии с не имеющим отношения к сути вопроса кодом?

как минимум, никому от этого не хуже.

Это сообщение отредактировал(а) boostcoder - 28.8.2010, 23:16
PM WWW   Вверх
MAKCim
Дата 29.8.2010, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



boostcoder
Нет, это не что-то из ряда вон выходящее
просто boost это не та либа, которую в принципе можно сувать (ака предлагать) куда/где попало: есть куча всяких задач, начиная с использования только С и заканчивая специфическими окружениями, где boost не применим

Короче, считаю пример бессмысленным в плане пользы автору от него...проехали в общем


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Wolf
Дата 29.8.2010, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пример номер два. С ним, я думаю, будет яснее.

Код

#include <iostream>

using namespace std;

int main()
{
    int i = 0;

    while (true) {
        i++;
    }

    return 0;
}


В любой операционной системе данный код приведёт к 100% загрузке процессора (или ядра на котором код выполняется) (пример - прикреплённый рисунок). Мне нужно избавиться от 100% загрузки процессора. И так, что можно для этого вставить в цикл while (true) {} ?

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  FreeBSD_8.1_2010_08_29_15_25_03.png 91,40 Kb
PM MAIL ICQ   Вверх
MAKCim
Дата 29.8.2010, 13:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



я же сказал, sched_yield
Код

#include <iostream>
using namespace std;
int main()
{
    int i = 0;
    while (true) {
        i++;
       sched_yield();
    }
    return 0;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


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

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



MAKCim, большое спасибо! Не заметил сразу.
PM MAIL ICQ   Вверх
Wolf
Дата 31.8.2010, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что-то это не помогает. В top смотрю, разница лишь в том, что с sched_yield система грузит проц под 100%, а без sched_yield, приложение. А как можно на очень короткое время переводить процесс или поток в ожидание?
PM MAIL ICQ   Вверх
REZiaMIX
Дата 31.8.2010, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Wolf @ 31.8.2010,  05:44)
Что-то это не помогает. В top смотрю, разница лишь в том, что с sched_yield система грузит проц под 100%, а без sched_yield, приложение. А как можно на очень короткое время переводить процесс или поток в ожидание?

Ожидание: nanosleep.
Вы что то не правильно делаете, такой цикл вообще использовать не стоит. Думаю тут надо думать другим путем, ошибка в архитектуре.


--------------------
user posted image
PM MAIL   Вверх
MAKCim
Дата 31.8.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Wolf
это поможет если большинство процессов не ограничены вводом-выводом
в противном случае просто некому грубо говоря передать управление и оно переходит обратно к вызывающему потоку


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


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

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



У меня не while(true), а примерно такое в потоках, занимающихся IO сокета:

Код

bool TermFlag;

//это функция потока
void *ThreadProc(void *Param)
{
     while (!TermFlag) {
          //Здесь распологаются функции обработки сокетов
          //как по другому, если не циклом, опрашивать их
          //состояние?
     }

     TermFlag = false;
}

//эта функция вызывается из управляющего потока
//для завершения потока
void Terminate()
{
     TermFlag = true;

     //Ждём окончания цикла функции потока
     while (TermFlag) ;
}


Скорее всего я не правильно понимаю работу планировщика. В общем если в цикле ваил тру есть, что считать, например i++, и процессор свободен, то вот, собственно говоря он и считает на 100% ресурса процессора. Как то так, видимо.
PM MAIL ICQ   Вверх
djamshud
Дата 1.9.2010, 15:04 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Wolf, man select, man epoll, man poll.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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