В принципе, вам нужны некоторые базовые строительные блоки для решения этой проблемы (я предполагаю, что вы хотите выполнить эту операцию копирования один раз. Мы можем легко расширить решение, если у вас есть постоянный поток входных данных):
1) Общая память - для обмена управляющей информацией. В этом случае это будет указатель исходного буфера, указатель целевого буфера и размер (от основного потока до рабочего потока). Вы также хотели бы, чтобы некоторая структура данных (давайте начнем с простого логического флага) обменивалась информацией в обратном направлении (от рабочего потока к основному потоку), когда работа завершена.
2) Условная переменная - для отправки сигнала из основного потока в рабочий поток и в обратном направлении. Итак, вам нужно 2 разных условных переменных.
3) Примитив синхронизации, такой как мьютекс, для защиты разделяемой памяти (поскольку к ним будут одновременно обращаться оба потока)
Учитывая эти строительные блоки, псевдокод вашей программы будет выглядеть так:
struct Control {
void* src, *dest;
int num_of_bytes = -1;
bool isDone = false;
conditional_var inputReceived;
conditional_var copyDone;
mutex m;
};
void childThread() {
m.lock();
while (num_of_bytes == -1) {
inputReceived.wait(m); // wait till you receive input.
}
// Input received. Make sure you set src and dest pointers, before setting num_of_bytes
mempcy(dest, src, num_of_bytes);
isDone = true; // mark work completion.
copyDone.notify(); // notify the main thread of work completion.
m.unlock();
}
void mainThread()
{
// Create worker thread at start;
thread_t thread = pthread_create(&childThread);
// Do other stuff...
//
//
// Input parameters received. Set control information, and notify the
// workerthread.
mutex.lock();
src = input.src;
dest = input.dest;
num_of_bytes = input.num_of_bytes;
inputReceived.notify(); // wake up worker thread.
while (!isDone) { // Wait for copy to be over.
copyDone.wait();
}
m.unlock(); // unlock the mutex.
thread.join(); // wait for thread to join. If the thread has already ended before we execute thread join, it will return immediately.
}
Если вы хотите расширить это решение для обработки потока входных данных, мы можем использовать 2 очереди для запросов и ответов, причем каждый элемент очереди является входными и выходными параметрами.