Имелось ввиду вот что:
Родительский процесс создает у себя хранилище строчек с путями.
При создании дочернего процесса ему передается адрес этого хранилища, куда он и будет добавлять строки.
Более гибкий вариант это инкапсулировать работу по добавлению строки в команду - обьект, который будет знать куда и как ее добавить, и передавать дочернему процессу эту команду.
Вариант 1:
typedef std::vector<std::string> string_container;
class ChildProcess
{
	string_container& container;
public:
	ChildProcess(string_container& cont) : container(cont) {}
	void run()
	{
		std::string str;
		//...
		container.push_back(str);
		//...
		delete this;
	}
};
class MainProcess
{
	string_container strings;
public:
	void run()
	{
		//...
		ChildProcess* proc = new ChildProcess(strings);
		proc->run();
		//...
	}
};
Вариант 2:
typedef std::vector<std::string> string_container;
class Command
{
public:
	virtual ~Command() {}
	virtual void doIt(std::string str) = 0;
};
class ChildProcess
{
	std::auto_ptr<Command> command;
public:
	ChildProcess(Command* cmd) : command(cmd) {}
	void run()
	{
		std::string str;
		//...
		command->doIt(str);
		//...
		delete this;
	}
};
class Mutex
{
public:
	void Lock() { /*...*/ }
	void UnLock() { /*...*/ }
};
class AddStringSynchronized : public Command
{
	string_container& container;
	Mutex& mutex;
public:
	AddStringSynchronized(string_container& cont, Mutex& m)
	: container(cont), mutex(m)
	{}
	void doIt(std::string str)
	{
		mutex.Lock();
		container.push_back(str);
		mutex.UnLock();
	}
};
class MainProcess
{
	string_container strings;
	Mutex synchronizer;
public:
	void run()
	{
		//...
		ChildProcess* proc = new ChildProcess(new AddStringSynchronized( strings, synchronizer ));
		proc->run();
		//...
	}
};
Преимущество второго варианта в том, что мы можем создавать произвольные команды, не изменяя код дочернего процесса