Следующая программа вылетает с
libc++abi.dylib: terminating with uncaught exception of type stxxl::io_error: Error in virtual void stxxl::ufs_file_base::lock() : fcntl(,F_SETLK,) path=/var/tmp/stxxl fd=5 : Resource temporarily unavailable: unspecified iostream_category error
Abort trap: 6
Это похоже на то, что мои два потока пытаются использовать один и тот же обработчик / файл для обновления файла stxxl til / var / tmp.
Есть ли хитрость для нескольких потоков, использующих несколько файлов в stxxl?
#include <stxxl/queue>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>void test() {
typedef stxxl::queue<unsigned int> queue;
queue my_queue;
for(unsigned long long i = 0; i != 1024L * 1024 * 1024; i++)
my_queue.push(10);
std::cout << "queue_size " << my_queue.size() << std::endl;
while(my_queue.size() != 0)
my_queue.pop();
std::cout << "queue_size " << my_queue.size() << std::endl;
}
int main()
{
pid_t pid;
pid_t cpid;
int status;pid = fork();
if (pid == 0)
{
test();
exit(0);
} else
{
test();
if ((cpid=wait(&status)) == pid){
std::cout << "Child " << pid << " returned" << std::endl;
}
}
return 0;
}
С STXXL 1.4.0 вы также можете использовать «###» в конфигурационном файле .stxxl. «###» заменяется текущим pid при открытии файлов.
Обратите внимание, что файлы на диске автоматически открываются при вызове первых функций STXXL. Таким образом, нужно отложить такие вызовы до тех пор, пока не будет завершена работа fork (), как вы сделали в своем примере.
Я нашел ответ сам, решение состоит в том, чтобы дать каждому потоку свой собственный виртуальный диск, это я сделал так:
stxxl::config * cfg = stxxl::config::get_instance();
std::string result;
std::ostringstream convert;
convert << id; // the id of the stream, to make th filenames different
result = convert.str();
std::string base_file = "/var/tmp/stxxl" + result;
stxxl::disk_config disk1(base_file, 100 * 1024 * 1024, "syscall autogrow delete_on_exit");
cfg->add_disk(disk1);