Для тех из вас, как я, ищущих вперед, объявляют структуру C-стиля, которая была определена с помощью typedef, в некотором c ++-коде, я нашел решение, которое выглядит следующим образом ...
// a.h
typedef struct _bah {
int a;
int b;
} bah;
// b.h
struct _bah;
typedef _bah bah;
class foo {
foo(bah * b);
foo(bah b);
bah * mBah;
};
// b.cpp
#include "b.h"
#include "a.h"
foo::foo(bah * b) {
mBah = b;
}
foo::foo(bah b) {
mBah = &b;
}
Использовать BlockingQueue
, а именно:
A
Очередь
, которая дополнительно поддерживает операции, ожидающие, пока очередь не станет пустой при получении элемент, и подождите, пока место станет доступным в очереди при хранении элемента.
Серьезно, не пытайтесь изобретать колесо здесь.
(Если вы должны использовать ожидание / уведомление, прочитайте это руководство . Но избавьте себя от боли, пожалуйста!)
Вот некоторые подробности:
import java.concurrent.Executors;
import java.concurrent.ExecutorService;
...
ExecutorService executor = Executors.newFixedThreadPool(someNumberOfThreads);
...
executor.execute(someObjectThatImplementsRunnable);
...
executor.shutdownNow();
Вот и все, что нужно сделать с помощью новых возможностей Java для многопоточности. Executor - это пул потоков с некоторым количеством NumberOfThreads. Питается блокирующей очередью. Все темы спят, если нет работы. Когда вы помещаете объект Runnable в очередь с помощью метода execute (), объект Runnable остается в очереди до тех пор, пока не станет доступным поток для его обработки. Затем вызывается метод run (). Наконец, метод shutdownNow () сигнализирует о закрытии всех потоков в пуле.
Теперь это намного проще, чем раньше.
(Существует множество вариаций, таких как пулы с минимальным и максимальным числом потоки или очереди, которые имеют максимальные размеры, прежде чем потоки, вызывающие execute (), заблокируются.)