Используйте
g++ test.cpp
вместо этого, так как это - код C++.
<час> Или, если Вы действительно хотите использовать gcc
, добавляют -lstdc++
к командной строке, как так:
gcc test.cpp -lstdc++
Выполнение md5
против эти a.out
произведенный согласно каждому сценарию показывает, что это - тот же вывод.
, Но, да, g++
, вероятно, делает Ваш мир более простым местом.
Вы правы, что синхронизация между процессами не будет работать с использованием конструкций синхронизации Java. К счастью, ваша проблема на самом деле не в синхронизации кода, а в синхронизации взаимодействий с базой данных.
Правильный способ решения этой проблемы - блокировки на уровне базы данных. Предположительно у вас есть таблица, содержащая версию схемы db, поэтому вам следует убедиться, что эта таблица заблокирована на время процесса запуска / обновления.
Точные задействованные вызовы sql / db, вероятно, будут более ясными, если вы укажете свой тип базы данных (DB2?) и метод доступа (необработанный sql, jpa и т. д.).
Обновление (8/4/2009, 14:39) : я предлагаю оператор LOCK TABLE для некоторых таблица, содержащая номер версии схемы.
Да, вы правы в том, что синхронизированные блоки не будут работать в кластере. Причина в том, как вы указали, что каждый узел имеет свою собственную JVM.
Однако есть способы заставить синхронизированные блоки работать в кластере, как они будут работать в среде с одним узлом. Самый простой способ - использовать такой продукт, как Terracotta , который будет обрабатывать координацию потоков между разными JVM, чтобы в кластере можно было использовать обычные элементы управления параллелизмом. Есть много статей, объясняющих, как это работает, например Введение в OpenTerracotta .
Конечно, есть и другие решения. В основном это зависит от того, чего вы действительно хотите здесь достичь. Я бы не стал использовать блокировки базы данных для синхронизации, если вам нужно масштабировать, в отличие от DB.
Поскольку вы говорите о 2 машинах, у вас даже нет общей памяти, поэтому синхронизировать нечего.
Мы делаем нечто подобное с нашей базой данных. Это достигается путем добавления в таблицу управления версиями записей. Вот что вам нужно сделать:
У вас должен быть только один сервер, обновляющий базу данных, если вы следуете этим правилам.
Не могли бы вы просто заблокировать таблицу (или всю базу данных) для обновлений, чтобы, когда первый узел получил блокировку, все остальные узлы не могли бы писать. Последующие узлы будут ждать, и когда блокировка будет снята, код будет обновлен, поэтому обновление записи не потребуется.