Ну все же вроде просто:
1. Инициализируются различные переменные и массивы C0, C1, C2, f1.
2. Потенциальный поток 1: Присваиваются значения a, b, c, пересчитываются вектора d, P, Q, вычисляется массив C1
3. Потенциальный поток 2: Присваиваются значения a, b, c, пересчитываются вектора d, P, Q, вычисляется массив C2
4. Вычисление error.
Проблема в том, что поток 2 пишет в те же переменные a, b, c, d, P, Q, что и поток 1. Когда потоки выполняются последовательно, то проблема не возникает, так как после выполнения потока 1 данные в этих переменных не нужны, а поток 2 никак не использует. Но когда параллельный поток еще выполняется, то они мешают друг другу. Выход: использовать разные переменные a, b, c, d, P, Q. Красиво это делается путем вынесения повторного кода в отдельную функцию.
А если потоков больше двух, например 3 или 4, то как тогда?