如下代码:
#include <vector>
#include <future>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <chrono>
std::vector<int> sleeping_sort(const std::vector<int> &arr) {
std::queue<int> q;
std::mutex mtx;
std::condition_variable cv;
bool all_done = false;
std::atomic<int> remaining = arr.size();
std::vector<std::future<void> > futures;
for (int num: arr) {
futures.emplace_back(std::async(std::launch::async,
[num, &q, &mtx, &cv, &remaining, &all_done]() {
std::this_thread::sleep_for(std::chrono::milliseconds(num)); {
std::lock_guard lock(mtx);
q.push(num);
}
cv.notify_one();
if (--remaining == 0) {
std::lock_guard<std::mutex> lock(mtx);
all_done = true;
cv.notify_all();
}
}));
}
std::vector<int> result;
while (true) {
std::unique_lock lock(mtx);
cv.wait(lock, [&] { return all_done || !q.empty(); });
while (!q.empty()) {
result.push_back(q.front());
q.pop();
}
if (all_done) break;
}
return result;
}