2016-10-09 1 views
0

Я хотел бы запустить вариант примера 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);

ответ

2

Вы должны объявить, но не определить, переменные в global.h:

extern boost::lockfree::queue<int> q; 
extern std::atomic<int> sum; 

Затем вам нужно определить их в отдельном файле, global.cpp:

boost::lockfree::queue<int> q{100}; 
std::atomic<int> sum{0}; 

Я думаю, что это должно исправить ваш вопрос. Для получения дополнительной информации см How do I use extern to share variables between source files?


Что касается второй части, спрашивая, почему вы не можете сделать блокировку свободной очереди строк, хорошо, что отвечает сообщением об ошибке: has_trivial_destructor ложно для std::string, потому что это динамически размерная строка, которая выделяет память. Вы не сможете использовать его в таком виде незакрепленной очереди. Вместо этого вы можете попробовать использовать строковый класс с фиксированным размером или std::array<char, N>.

+0

Ну, я попробовал, и у меня две проблемы: 1) кажется, что глобальная очередь не обновляется в файле заголовка. 2) Кроме того, я не могу сделать очередь строк. –

+0

@ArielBaron: Хорошо, спасибо за подробности. Я обновил свой ответ, чтобы исправить (1). Что касается (2), что вы имеете в виду, что вы «не можете»? Вы получили сообщение об ошибке? –

+0

Для 2) Я получаю сообщение об ошибке и для 1) сумма отображает нуль, указывающий, что очередь не заполняется –

Смежные вопросы