Я хотел бы запустить вариант примера 46.3 с этого сайта http://theboostcpplibraries.com/boost.lockfree. Я нахожусь в Linux-системе.running boost: блокировка бесплатных очередей глобально по нескольким файлам
Я хотел бы, чтобы очередь q была определена в файле заголовка. Я хотел бы, чтобы функции продукта и потребления были в разных файлах. Так что я хотел бы иметь global.h содержат
static boost::lockfree::queue<int> q{100};
static std::atomic<int> sum{0};
void *produce (void*);
void *consume (void*);
Я тогда хотел бы иметь produce.cpp содержать:
void *produce(void*)
{
for (int i = 1; i <= 10000; ++i)
q.push(i);
}
, и я хотел бы иметь consume.cpp содержат
void *consume (void*)
{
int i;
while (q.pop(i))
sum += i;
}
Я тогда хотел, чтобы мой main.cpp содержат
#include iosteam
#include iomanip
#include global
#include pthread
int main()
{pthread_t t1;
pthread_t t2;
pthread_t t3;
int t1_iret;
t1_iret = pthread_create(&t1, NULL, produce, NULL);
if(t1_iret)
{
fprintf(stderr,"Error - pthread_create() return code: %d\n",t1_iret);
exit(EXIT_FAILURE);
}
int t2_iret;
t2_iret = pthread_create(&t2, NULL, consume, NULL);
if(t2_iret)
{
fprintf(stderr,"Error - pthread_create() return code: %d\n",t2_iret);
exit(EXIT_FAILURE);
}
int t3_iret;
t3_iret = pthread_create(&t3, NULL, consume, NULL);
if(t3_iret)
{
fprintf(stderr,"Error - pthread_create() return code: %d\n",t3_iret);
exit(EXIT_FAILURE);
}
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_join(t3, NULL);
return 0; }
Кроме того, мне было интересно, можно ли делать то, что я описал, с целыми, а не целыми числами.
edit1: когда я пытаюсь сделать очереди быть очереди строк, которые я получаю ::
/usr/local/include/boost/lockfree/queue.hpp: В конкретизации «класса наддува :: л ockfree :: queue> ': /home/ubuntu/Project/src/main.cpp:15:37: требуется отсюда /usr/local/include/boost/lockfree/queue.hpp:87:5: ошибка: статическая утверждение не выполнено: (boost :: has_trivial_destructor :: значение) BOOST_STATIC_ASSERT ((boost :: has_trivial_destructor :: значение)); ^ /usr/local/include/boost/lockfree/queue.hpp:91:5: ошибка: статическое утверждение не выполнено: (boost :: has_trivial_assign :: значение) BOOST_STATIC_ASSERT ((boost :: has_trivial_assign :: значение)) ; ^ В файл включен из /usr/local/include/boost/lockfree/queue.hpp:21:0, из /home/ubuntu/Project/src/main.cpp:5: /usr/local/include /boost/lockfree/detail/copy_payload.hpp: при создании «static void boost :: lockfree :: detail :: copy_constructible_and_copyable :: copy (T &, U &) [с T = std :: basic_string; U = int] ': /usr/local/include/boost/lockfree/detail/copy_payload.hpp:49:25: требуется от void boost :: lockfree :: detail :: copy_payload (T &, U &) [ с T = std :: basic_string; U = int] ' /usr/local/include/boost/lockfree/queue.hpp:402:61: требуется от bool boost:: lockfree :: queue :: pop (U &) [с U = int; T = std :: basic_string; A0 = boost :: параметр :: void_; A1 = boost :: параметр :: void_; A2 = boost :: par ameter :: void_] ' /home/ubuntu/Project/src/main.cpp:21:24: требуется отсюда /usr/local/include/boost/lockfree/detail/copy_payload.hpp: 38: 11: error: недействительный листинг из типа 'std :: basic_string' для типа 'int' u = U (t);
Ну, я попробовал, и у меня две проблемы: 1) кажется, что глобальная очередь не обновляется в файле заголовка. 2) Кроме того, я не могу сделать очередь строк. –
@ArielBaron: Хорошо, спасибо за подробности. Я обновил свой ответ, чтобы исправить (1). Что касается (2), что вы имеете в виду, что вы «не можете»? Вы получили сообщение об ошибке? –
Для 2) Я получаю сообщение об ошибке и для 1) сумма отображает нуль, указывающий, что очередь не заполняется –