Вот то, почему:
Человекочитаемый. Это делает намного легче определить ошибку, и в файле и в методе парсинга. Также может быть считан вслух. Это - то, которое Вы просто не можете получить с XML и могли бы иметь значение, особенно в поддержке клиентов.
Страховка от устаревания. Целых regex существуют, возможно записать довольно хороший синтаксический анализатор во всего нескольких строках кода.
Рычаги. Почти все там, от систем управления версиями до редакторов для фильтрации, может осмотреть, объединиться и воздействовать на плоские файлы. Слияние XML может быть путаницей.
Способность интегрировать их скорее легко с инструментами UNIX, такими как grep, сокращение или sed.
Я думаю, что хорошим кроссплатформенным эквивалентом событий win32 является boost :: condition , поэтому ваш код может выглядеть примерно так:
void foo()
{
boost::mutex mtxWait;
boost::condition cndSignal;
bCall(boost::bind(&bar, mtxWait, cndSignal));
boost::mutex::scoped_lock mtxWaitLock(mtxWait);
cndSignal.wait(mtxWait); // you could also use cndSignal.timed_wait() here
}
void bar(boost::mutex& mtxWait, boost::condition& cndSignal)
{
doSomething();
cndSignal.notify_one();
}
вы можете использовать ускоряющий поток барьер
#include <boost/thread/thread.hpp>
#include <boost/thread/barrier.hpp>
#include <iostream>
void foo(boost::barrier* b)
{
std::cout << "foo done" << std::endl;
b->wait();
}
int main()
{
std::cout << "start foo" << std::endl;
boost::barrier b(2);
boost::thread t(&foo, &b);
b.wait();
std::cout << "after foo done" << std::endl;
t.join();
}
Я делал (или видел) все следующее в разное время для подобных вещей:
Используйте мьютекс + условную переменную.
Используйте канал, имея foo создайте канал и передайте его конец записи в bar. Бар затем записывает в трубу, когда бар готов. (Это даже работает с несколькими процессами.)
Проведите опрос foo для логического значения (да, это плохая идея).
All these answers are too complex, come on people it isn't that hard.
namespace porting
{
class Event;
typedef Event* Event_handle;
static const unsigned k_INFINITE = 0xFFFFFFFF;
class Event
{
friend Event_handle CreateEvent( void );
friend void CloseHandle( Event_handle evt );
friend void SetEvent( Event_handle evt );
friend void WaitForSingleObject( Event_handle evt, unsigned timeout );
Event( void ) : m_bool(false) { }
bool m_bool;
boost::mutex m_mutex;
boost::condition m_condition;
};
Event_handle CreateEvent( void )
{ return new Event; }
void CloseHandle( Event_handle evt )
{ delete evt; }
void SetEvent( Event_handle evt )
{
evt->m_bool = true;
evt->m_cond.notify_all();
}
void WaitForSingleObject( Event_handle evt, unsigned timeout )
{
boost::scoped_lock lock( evt->m_mutex );
if( timeout == k_INFINITE )
{
while( !evt->m_bool )
{
evt->m_cond.wait( lock );
}
}
else
{
//slightly more complex code for timeouts
}
}
}// porting
void foo()
{
porting::Event_handle evt = porting::CreateEvent();
bCall( boost::bind(&bar, evt ) );
porting::WaitForSingleObject( evt, porting::k_INFINITE );
porting::CloseHandle(evt);
}
void bar( porting::Event_handle evt )
{
doSomething();
porting::SetEvent(evt);
}
There is probably a bit more to do to get this fully working as I'm not familiar with the semantics of WaitForSingleObject
(what happens if two threads call it at the same time, what happens if the same thread calls it twice). However, the solution will look very much like this.
Похоже, Вы ищете механизм сигнальных слотов. Вы можете найти его в:
, кроссплатформенные.
Пример Qt:
#include <QObject>
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
private:
int m_value;
};
Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
&b, SLOT(setValue(int)));
a.setValue(12); // a.value() == 12, b.value() == 12
b.setValue(48); // a.value() == 12, b.value() == 48
void Counter::setValue(int value)
{
if (value != m_value) {
m_value = value;
emit valueChanged(value);
}
}
В системах, совместимых с Posix, вы можете использовать Posix IPC. Он используется для обмена сообщениями между процессами и потоками. Если я правильно помню, доступен порт cygwin.