我正在用几个有限状态机在qt/Linux中构建一个嵌入式系统。每个FSM都有自己的事件队列和一个连续运行的线程函数。 FSM可能会向彼此发布事件。EventQueues和互斥体
显然事件队列在访问时应该被锁定和解锁。 我应该将互斥锁放入FSM,EventQueue还是将全局变量传递给FSM?
下面是伪代码:
class EventQueue {
int queue[100];
int head;
int tail;
void postEvent(int event) {
// place the event to circular buffer
// checking of head/tail neglected
queue[tail++] = event;
}
int getNextEvent() {
// checking of head/tail neglected
return queue[head++];
}
bool isEmpty() {
return false; // or true if the queue is not empty
}
};
class FSM {
EventQueue queue;
FSM * other;
pthread_t thread;
void start() {
int t = pthread_create(&thread, NULL, FSM::run, NULL);
}
// thread function
void * run(void *) {
while (true) {
if (!queue.isEmpty()) {
int e = queue.getNextEvent();
dispatch(e); // should be perform by state class actually
}
}
}
virtual void dispatch(int event) = 0;
};
class FSM_A : FSM {
void dispatch(int event) {
other->postEvent(1234); // send event to other state machine
usleep(100);
}
};
class FSM_B : FSM {
void dispatch(int event) {
other->postEvent(4567); // send event to other state machine
usleep(200);
}
};
void main() {
FSM_A fsmA;
FSM_B fsmB;
fsmA.other = &fsmB;
fsmB.other = &fsmA;
fsmA.start():
fsmB.start():
}
谢谢!
'bool isEmpty(){mutex.lock();返回false; mutex.unlock(); }和你的互斥锁永远不会解锁!返回后无法访问。 – Evgeny
您应该改用QMutexLocker。 – Evgeny
好赶上哈哈。确实使用mutexlocker来避免这些booboos – Teimpz