- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
class Mutex
{
HANDLE m_Mutex;
public:
Mutex()
{
m_Mutex = CreateMutex(0, false, 0);
}
~Mutex()
{
ReleaseMutex(m_Mutex);
CloseHandle(m_Mutex);
}
void Lock()
{
auto lv_WaitResult = WaitForSingleObject(m_Mutex, 10000);
assert(lv_WaitResult != WAIT_TIMEOUT);
}
void Unlock()
{
ReleaseMutex(m_Mutex);
}
};
template<int C>
struct GLocker
{
static Mutex m_Mutex;
};
template<int C> Mutex GLocker<C>::m_Mutex;
class Locker
{
Mutex *m_Mutex;
public:
Locker(Mutex &_Mutex)
{
m_Mutex = &_Mutex;
m_Mutex->Lock();
}
virtual ~Locker()
{
m_Mutex->Unlock();
}
};
class ThreadCreator
{
protected:
static void NewThread(void *_Func)
{
(*(std::function<void()>*)_Func)();
delete (std::function<void()>*)_Func;
}
public:
static ThreadCreator g_ThreadCreator;
HANDLE operator=(const std::function<void()> &_Func)
{
std::function<void()> *lv_Func = new std::function<void()>(_Func);
return (HANDLE)_beginthread(ThreadCreator::NewThread,0,(void*)lv_Func);
}
};
ThreadCreator ThreadCreator::g_ThreadCreator;
#define LOCK const Locker _Lock##__LINE__##__COUNTER__ = GLocker<9000 + __COUNTER__>::m_Mutex // 9000 является запасом для пользовательских номеров.
#define LOCK_EX(Port) const Locker _Lock##__LINE__##__COUNTER__ = GLocker<Port>::m_Mutex // блокирует определённый мьютекс, полезно когда нужно делать синхронизацию из разных мест.
#define GO_FUNC ThreadCreator::g_ThreadCreator =
#define GO_EX(...) GO_FUNC [__VA_ARGS__]() mutable -> void
#define GO GO_FUNC []() -> void
defecate-plusplus 25.04.2013 18:13 # +7
опять позоришь непонятого гения? что о тебе скажут потомки? дантес померкнет перед твоим презренным именем
bormand 25.04.2013 19:13 # +2
Xom94ok 25.04.2013 20:45 # +4
bormand 26.04.2013 11:52 # +6
roman-kashitsyn 25.04.2013 21:34 # +4
У крестов свой, особенный путь - каждый раз писать велики.
LispGovno 25.04.2013 22:46 # −1
И как beginthread из указателя на стд::факшен работает?
LispGovno 25.04.2013 22:56 # +1
bormand 26.04.2013 06:00 # +1
LispGovno 26.04.2013 08:33 # 0
bormand 26.04.2013 08:58 # 0
Виртуальный вызов по ссылке он может оптимизнуть только в том случае, если уверен в типе объекта (например если сам объект описан в теле той же функции).
А деструктор-то можно сделать невиртуальным. И если удалять через ссылку/указатель на правильный тип - все будет ок. Если через указатель на предка - будет фейл.
LispGovno 26.04.2013 09:37 # 0
http://ideone.com/jBSFyJ
Виртуального деструктора нет, а правильный деструктор вызывается. Ну а про shared_ptr ты и сам знаешь почему виртуальный деструктор не нужен
bormand 26.04.2013 10:06 # +1
Так это деструктор от временного объекта D() сработал. Куда он денется то? Это как я и написал выше "например если сам объект описан в теле той же функции".
> про shared_ptr ты и сам знаешь почему виртуальный деструктор не нужен
Ну кроме не совсем корретных случаев, когда успели кастануть к предку перед тем, как засунуть в шаропоинтер.
bormand 26.04.2013 06:03 # +2
LispGovno 26.04.2013 11:03 # +2
> tread_creation
> tread
bormand 26.04.2013 11:57 # +2
Ага! Нам хотят рассказать о std::mutex и std::thread... Интересно, почитаем...
> Для этого нам понадобятся несколько классов и макросов.
... фублядь, опять какой-то дурно пахнущий велосипед... Да еще и сплошные непортабельные виндоблядства...
defecate-plusplus 26.04.2013 12:02 # +2
Wife says: "I can't believe it works"
http://blog.think-async.com/2009/07/wife-says-i-cant-believe-it-works.html
bormand 26.04.2013 12:39 # +1
Код, конечно, по-своему красив. Но вот поддерживать такой роллтон в одной функции мне было бы страшновато...
LispGovno 26.04.2013 12:49 # 0
Ниасилятор boost::asio, коорутин и boost::lambda detected. Пrаативный.
Интересно, какой ферймворк коорутин использовали? Потому что switch-caseный не умеет в исключения и в объекты с деструкторами.
bormand 26.04.2013 13:01 # +1
Вполне так осилятор. Таймер разве что неудобный, а так либа годная (юзаю ее удп сервер и таймеры).
> boost::lambda
Ну не люблю я лямбды в императивном коде. Умеренно юзаю, в тех местах где они удобны и не превышают пары строчек, но код на одних лямбдах аля
нода-жс считаю ролтоном.
> Потому что switch-caseный не умеет в исключения и в объекты с деструкторами.
Может быть первые прототипы boost::coroutine с переключалкой стеков?
bormand 26.04.2013 13:09 # +1
Не всё, что осилено должно понравиться, ой не всё...
P.S. Если интересно - могу выложить сей говнопарсер на всеобщее порицание ;)
LispGovno 26.04.2013 13:22 # 0
уговорил, попробуй
roman-kashitsyn 26.04.2013 13:11 # +6
Ниасилятор метода детекции ниосиляторов детектед
Abbath 26.04.2013 22:41 # +4
Детектор ниасиляторов метода детекции ниосиляторов детектед.
LispGovno 27.04.2013 17:38 # 0
scriptin 27.04.2013 20:32 # 0
LispGovno 27.04.2013 23:09 # 0