невозможно отправить в очередь, созданную статической картой - PullRequest
0 голосов
/ 10 октября 2011

Так что, в основном, у меня есть статическая карта, которая отображает мою структуру в очередь, но когда я пытаюсь выдвинуть ее, она ничего не выдвигает.

struct SignalID_t {
    unsigned int lock;
    unsigned int cond;

    SignalID_t(unsigned int lock_, unsigned int cond_):lock(lock_), cond(cond_) {}
};

class SignalIDComp {
public:
bool operator()(const SignalID_t& a, const SignalID_t& b) const
    {return a.lock == b.lock && a.cond == b.cond;}
}; 

class ThreadManager{
public:

static std::queue<ucontext_t *>& waitingQ(SignalID_t id)
    {return threadsWaitingOnConditions[id];}

private:
    static std::map<SignalID_t, std::queue<ucontext_t*>> threadsWaitingOnConditions;
}

map<SignalID_t, queue<ucontext_t *>, SignalIDComp>    ThreadManager::threadsWaitingOnConditions;

class Threads{

void thread_wait(int lock, int cond){
    SignalID_t id(lock, cond);
    ThreadManager::waitingQ(id).push(ThreadManager::getRunningThread());
    if (ThreadManager::waitingQ(id).empty())
       cout << "failed to push thread to cond waiting Q" << endl;
}
}

В функции, в которой я пытаюсь перейти в очередь, я немедленно проверяю очередь, чтобы убедиться, что она пустая и всегда указывает, что она есть. Я подозреваю, что это может быть связано с тем, что карта является статической, и очередь не инициализируется должным образом, но я не могу исправить это.

1 Ответ

1 голос
/ 10 октября 2011

У вас есть два отдельных объекта, к сожалению, с одинаковыми именами:

map_type ThreadManager::threadsWaitingOnConditions;

и

map_type threadsWaitingOnConditions;

Вы путаете их.Окончательная проверка должна сказать:

if (ThreadManager::threadsWaitingOnConditions[id].empty()) { /* ... */ }

или что-то на этот счет.Учитывая, что статическая карта-член является закрытой, вы, вероятно, должны просто сказать:

if (ThreadManager::waitingQ(id).empty()) { /* ... */ }

Я не понимаю, что вам нужно с объектом глобальной карты.Это кажется ненужным.Или, скорее, вы, вероятно, подразумеваете, что это определение статического объекта-члена, и в этом случае вы должны написать это так:

map<SignalID_t, std::queue<ucontext_t*>> ThreadManager::threadsWaitingOnConditions;
//                                       ^^^^^^^^^^^^^^^
...