Skip to content

Instantly share code, notes, and snippets.

@darkf
Created June 5, 2015 05:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save darkf/6090fe801769d205a349 to your computer and use it in GitHub Desktop.
Save darkf/6090fe801769d205a349 to your computer and use it in GitHub Desktop.
Useless parallel stack allocator in C++
#include <cstring>
#include <iostream>
#include <thread>
#include <future>
#include <queue>
std::mutex mqMutex;
std::queue<std::tuple<size_t, std::promise<void*>&>> mq;
void * alloc(size_t len) {
std::promise<void*> p;
{
std::lock_guard<std::mutex> lock(mqMutex);
mq.emplace(len, p);
}
std::future<void*> future = p.get_future();
future.wait();
return future.get();
}
void alloc_task() {
while(true) {
// should wait for some flag to be triggered here really
std::lock_guard<std::mutex> lock(mqMutex);
if(!mq.empty()) {
auto rp = mq.front();
mq.pop();
void *ptr = alloca(std::get<0>(rp));
std::get<1>(rp).set_value(ptr);
}
}
}
int main() {
std::thread task {alloc_task};
task.detach();
char *buffer = (char *) alloc(4);
strcpy(buffer, "lol");
char *buffer2 = (char *) alloc(4);
strcpy(buffer2, "abc");
std::cout << buffer << std::endl;
std::cout << buffer2 << std::endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment