Зависит от подхода к реализации.crypto5 wrote:При этом кроме незначительных уточнений вам пришлось еще и придумывать ограничения на внутреннюю реализацию ))Мальчик-Одуванчик wrote:проверить насколько продумано изначальное решение и как оно может адаптироваться к незначительным уточнениям.crypto5 wrote:Ну так задачу можно до бесконечности дополнять мелкими деталями, типа, потом парикмахер может брать к себе не всех клиентов, а соответствующих определенному условию, или клиенты хотят попадать все время к своему парикмахеру, или парикмахеры работают посменно, в чем смысл то?Мальчик-Одуванчик wrote:Тут как-бы очевидно, что должна быть привязка ниток к парикмахемам и допустимое наличие дополнительных правил обработки.crypto5 wrote: Мой вариант этот кейс покрывает, можно просто в создании thread pool увеличить количество тредов, и все автоматически работает.
К примеру парикмахер, уже обслуживающий N-го (в своем пуле) клиента не имеет права брать N+1-го до тех пор пока все остальные не наберут N
Ведение блога в ИТ
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: Ведение блога в ИТ
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Ведение блога в ИТ
Поздравляю с ненапрасно затраченными усилиямиSergunka wrote:К слову сказать сегодня тех лид сказал, что перед тем как рекомендовать меня взять начальству мой блог почитал

In vino Veritas!
-
- Уже с Приветом
- Posts: 1665
- Joined: 16 Jul 2009 14:18
- Location: Uganda
Re: Ведение блога в ИТ
Josh Smith, Advanced MMVM - книга, первоначально написанная в виде блога. Насколько я видел на профильных и пр. форума - очень неплохо продавалась для технической литературы. Ну и являлась приятным бонусом к имени человека, который имя "сделал" на описании разных фич MVVM спецификации для Silverlight.
Так что идея вести некий блог и потом конвертировать его во что-то более серьезное - вполне себе работает. Главное - чтобы было что писать
Так что идея вести некий блог и потом конвертировать его во что-то более серьезное - вполне себе работает. Главное - чтобы было что писать

-
- Уже с Приветом
- Posts: 4195
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: Ведение блога в ИТ
скажи спасибо модератору, если б он тебя не забанил на привете, фиг бы ты что написалSergunka wrote:К слову сказать сегодня тех лид сказал, что перед тем как рекомендовать меня взять начальству мой блог почитал
-
- Уже с Приветом
- Posts: 34164
- Joined: 03 Dec 2000 10:01
- Location: Vladivostok->San Francisco->Los Angeles->San Francisco
Re: Ведение блога в ИТ
Оказывается история с блогом имеет продолжение уже от самого начальстваcrypto5 wrote:Поздравляю с ненапрасно затраченными усилиямиSergunka wrote:К слову сказать сегодня тех лид сказал, что перед тем как рекомендовать меня взять начальству мой блог почитал

"A patriot must always be ready to defend his country against his government." Edward Abbey
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: Ведение блога в ИТ
то есть если раньше ты писал по вдохновению, то теперь осознанно будешь впаривать?
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: Ведение блога в ИТ
Мальчик-Одуванчик wrote:то есть если раньше ты писал по вдохновению, то теперь вдохновенно будешь впаривать?
-
- Уже с Приветом
- Posts: 34164
- Joined: 03 Dec 2000 10:01
- Location: Vladivostok->San Francisco->Los Angeles->San Francisco
Re: Ведение блога в ИТ
Вообще-то я посмотрел получается я за месяц 8 коротких статеек в блог написал - просто ацкий графоманМальчик-Одуванчик wrote:то есть если раньше ты писал по вдохновению, то теперь осознанно будешь впаривать?

"A patriot must always be ready to defend his country against his government." Edward Abbey
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: Ведение блога в ИТ
Примерно то же самое, но немножко короче при использовании bost::asioAxelA wrote:Гулять так гулять. Достаем из шир.. то есть тяжелую артилерию.Интеррапт wrote:Ну раз пошла такая пьянка, то и мы парикмахера напишем:
C++ с модными 11x свистелками и перделками.Code: Select all
#include <stdio.h> #include <atomic> #include <condition_variable> #include <deque> #include <memory> #include <mutex> #include <queue> #include <thread> using namespace std; class Barber; class Client; class Shop; typedef shared_ptr<Client> ClientPtr; static const int NUM_CHAIRS = 5; static const int NUM_CLIENT_THREADS = 20; static chrono::milliseconds BARBER_SESSION_TIME(50); static chrono::milliseconds PAUSE_BETWEEN_CLIENTS(200); class Client { public: const int _id; Client(int id) : _id(id) {}; }; class Shop { public: bool Serve(ClientPtr client) { lock_guard<mutex> guard(_lock); if (!_waitLine.empty() || _chair != nullptr) { if (_waitLine.size() >= NUM_CHAIRS) { printf("Client %d left unsatisfied.\n", client->_id); return false; } _waitLine.push(client); printf("Client %d is wating.\n", client->_id); } else { assert(_chair == nullptr); _chair = client; printf("Client %d is about to be served.\n", client->_id); } _signal.notify_one(); return true; } private: friend class Barber; ClientPtr GetNextClient() { while (true) { unique_lock<mutex> guard(_lock); if (_chair == nullptr && !_waitLine.empty()) { _chair = _waitLine.front(); _waitLine.pop(); } if (_chair != nullptr) { return _chair; } printf("Barber is sleeping.\n"); _signal.wait(guard); printf("Barber wakes up.\n"); } } void DoneWithClient() { lock_guard<mutex> guard(_lock); assert(_chair != nullptr); _chair = nullptr; if (!_waitLine.empty()) { _signal.notify_one(); } } mutex _lock; condition_variable _signal; queue<ClientPtr> _waitLine; ClientPtr _chair; }; class Barber { public: Barber(Shop& shop) : _shop(shop) {}; void run() { while (true) { ClientPtr client = _shop.GetNextClient(); CutEverything(client); _shop.DoneWithClient(); } } private: void CutEverything(ClientPtr client) { printf("Serving client#%d.\n", client->_id); this_thread::sleep_for(BARBER_SESSION_TIME); } Shop& _shop; }; static void ClientThread(Shop* shop) { static atomic_int clientID; while (true) { ClientPtr client = make_shared<Client>(clientID++); shop->Serve(client); this_thread::sleep_for(PAUSE_BETWEEN_CLIENTS); } } static void BarberThread(Shop* shop) { Barber barber(*shop); barber.run(); } static void test() { Shop shop; thread barberThread(&BarberThread, &shop); thread clientThreads[NUM_CLIENT_THREADS]; for (int i = 0; i < NUM_CLIENT_THREADS; i++) { clientThreads[i] = thread(ClientThread, &shop); } this_thread::sleep_for(chrono::hours(1000)); } void main() { test(); }
Code: Select all
#include <boost/thread.hpp>
#include <boost/asio.hpp>
#include <iostream>
using namespace boost::asio;
io_service service;
void serveclient(std::string name) {
std::cout << "serving client: " << name << std::endl;
}
int main()
{
std::string clients[] = {"client1","client2","client3","client4","client5","client6"};
for(std::string client : clients) service.post(bind(serveclient,client));
boost::thread_group threads;
for(int barber=0; barber < 2; barber++) threads.create_thread([](){service.run();});
boost::this_thread::sleep(boost::posix_time::seconds(1));
threads.join_all();
return 0;
}
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Ведение блога в ИТ
А где задается сколько в парикмахерской стульев в зале ожидания?
In vino Veritas!
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: Ведение блога в ИТ
Это вы верно заметили. За давностью я уже подзабыл начальные условия. И про стулья в зале ожидания и про то что парикмахер только один. Заглянул в блог Сергуньки - там даже нет условия в каком порядке обслуживаются посетители, присевшие на стул.crypto5 wrote:А где задается сколько в парикмахерской стульев в зале ожидания?
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: Ведение блога в ИТ
Вечерком переделал - получилась банальщина. Одна рабочая нитка, она же рабочее место, она же парикмахер.
Совсем неинтересно. Наверное стоит усложнить задачу.
-добавить несколько рабочих стульев как в типичной парикмахерской. То есть парикмахер может обслуживать несколько клиентов единовременно
-ввести очерёдность обслуживания
Потом ещё немножко усложнить :
-добавить несколько парикмахеров. (редко мне попадалась парикмахерская с одним парикмахером)
-добавить запись к конкретному парикмахеру и очередность обслуживания в рамках нескольких очередей (при этом рабочие стулья и стулья для ожидания - общие)
Вот тогда возможно и появится уровень задачки для интервью
Code: Select all
io_service service;
std::atomic<int> available_chairs;
void serveclient(std::string client) {
++available_chairs;
std::cout << "serve client: " << client << ",available chairs: " << available_chairs << std::endl;
}
void visitclient(std::string client) {
if(available_chairs) {
--available_chairs;
service.post(bind(serveclient,client));
} else { std::cout << "no available chairs" << std::endl;}
}
int main() {
std::string clients[] = {"client1","client2","client3","client4","client5","client6"};
available_chairs=5;
boost::thread_group threads;
threads.create_thread([](){service.run();});
for(std::string client : clients) visitclient(client);
boost::this_thread::sleep(boost::posix_time::seconds(1));
threads.join_all();
return 0;
}
-добавить несколько рабочих стульев как в типичной парикмахерской. То есть парикмахер может обслуживать несколько клиентов единовременно
-ввести очерёдность обслуживания
Потом ещё немножко усложнить :
-добавить несколько парикмахеров. (редко мне попадалась парикмахерская с одним парикмахером)
-добавить запись к конкретному парикмахеру и очередность обслуживания в рамках нескольких очередей (при этом рабочие стулья и стулья для ожидания - общие)
Вот тогда возможно и появится уровень задачки для интервью
-
- Новичок
- Posts: 46
- Joined: 23 Apr 2011 18:43
- Location: WA
Re: Ведение блога в ИТ
Ну конечно не интересно, у вас клиенты того, строем ходят.Мальчик-Одуванчик wrote:Вечерком переделал - получилась банальщина. Одна рабочая нитка, она же рабочее место, она же парикмахер.Совсем неинтересно.Code: Select all
int main() { std::string clients[] = {"client1","client2","client3","client4","client5","client6"}; ... for(std::string client : clients) visitclient(client); ... }
Когда они будут из разных веток приходить, должно стать слегка повеселее.
// И, кстати, это не совсем канонично - всегда пускать клиентов через queue.
// В оригинальной (по крайней мере в википедиевской) формулировке, в wait room идут только когда парикмахер занят.
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: Ведение блога в ИТ
Об том что ходят строем я подумал но решил для простоты не вводить временных задержек.AxelA wrote:
Ну конечно не интересно, у вас клиенты того, строем ходят.
Когда они будут из разных веток приходить, должно стать слегка повеселее.
// И, кстати, это не совсем канонично - всегда пускать клиентов через queue.
// В оригинальной (по крайней мере в википедиевской) формулировке, в wait room идут только когда парикмахер занят.
Хотя согласен, что таймауты между приходами клиентов и ввседение времени обслуживания сделают пример поинтереснее. Что касается сведения к каноническому случаю, то можно считать что общее количество стульев это
один стул парикмахера и оставшиеся в комнате ожидания.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Ведение блога в ИТ
Всмысл не в "строем" и с задержкой, а в том что они приходят одновременно и в разных потоках. На данный момент ваша программа такое обрабатывает некоректно, например между if(available_chairs) и --available_chairs; в другом потоке кто-то может тоже уменьшит значение, и тогда у вас там окажется негативное значение, а клиентов в зале ожидания будет больше чем стульев.Мальчик-Одуванчик wrote: Об том что ходят строем я подумал но решил для простоты не вводить временных задержек.
In vino Veritas!