phthread: Work queue

25/03/2011 - 11:15 von Curtis Newton | Report spam
Hallo,

ich suche sowas hier: http://www.codeproject.com/KB/threa...queue.aspx

Ich möchte eine Work queue mit nur einem Thread. Ich will bestimmte
Arbeiten im Hintergrund nacheinander ausführen. Ich dachte, sowas gibt
es schon, da muss man das Rad ja nicht neu erfinden. Ich finde aber
leider nichts auf Basis von pthreads.

Irgendwelche Tips?

C.
 

Lesen sie die antworten

#1 Edzard Egberts
25/03/2011 - 12:14 | Warnen spam
Curtis Newton schrieb:
Hallo,

ich suche sowas hier: http://www.codeproject.com/KB/threa...queue.aspx

Ich möchte eine Work queue mit nur einem Thread. Ich will bestimmte
Arbeiten im Hintergrund nacheinander ausführen. Ich dachte, sowas gibt
es schon, da muss man das Rad ja nicht neu erfinden. Ich finde aber
leider nichts auf Basis von pthreads.

Irgendwelche Tips?



Ich habe mir sowas mit einer stl::list gebastelt:

class t_myclass: public ns_thread::t_thread
{ // ns_thread::t_thread macht die Threaderzeugung und
// stellt eine virtuelle Threadfunkion zur Verfügung,
// die vom Thread aufgerufen wird, also die
// Threadschleife enthàlt
public:
enum fooval { fFoo1, fFoo2, fFooQ };

void Befehl(fooval B, int Para)
{ m_Stack.push_back(foostack(B, Para)); }

bool Busy() { return !m_Stack.empty(); }

private:
struct foostack
{
fooval Foo;
int Para;
foostack(fooval F, int P= 0): Foo(F), Para(P) {}
};
typedef std::list< foostack > td_stack;
td_stack m_Stack;

virtual void Thread()
{ // Threadfunction:
while(true)
{
while (m_Stack.empty()) Sleep(100);
switch (m_Stack.front().Foo)
{
case fFooQ: return; // Quit thread
case fFoo1: do_something(m_Stack.front().Para; break;
}
m_Stack.pop_front();
}
}
};

Das funktioniert in der Hoffnung, dass
std::list::push_back/pop_front/empty atomare Operationen sind, ansonsten
müsste man das noch in eine CriticalSection packen. Naja, so rein
empirisch geht das. ;o)

Ähnliche fragen