Прежде всего, это довольно плохая практика, чтобы использовать поплавки в таких случаях. Используйте целое число.
Есть еще одно предложение. Вы можете использовать сегментацию - синхронизировать только несколько потоков одним мьютексом / атомарным (один сегмент). А затем собрать общее количество среди всех сегментов.
Кроме того, есть хорошее место, чтобы начать поиск высокопараллельных алгоритмов: http://www.1024cores.net/home/lock-free-algorithms
UDPATE
Есть пример проблем с поплавком
#include <iostream>
using namespace std;
int main() {
float f = 0;
for(int i=0; i<100000-98; ++i)
{
f += 0.00001;
}
cout << f << endl;
}
Таким образом, если у вас 100 заданий с 1000 шагами в каждом, вы получите результат на 98 в 98 раньше, чем вы могли ожидать.