1) ваши for (i = thread;i < threads;i += threads) ничего не делают и эквивалентны int i = thread;
2) когда вы печатаете массив целиком, потоки могут печатать значения в произвольном порядке. выводите на печать номер треда, который печатает это значение
3) не сразу заметил. переменные, описанные вне pragma omp - общие для всех потоков. в итоге переменная с номером потока оказывается перезаписанной другим потоком. и к моменту сравнения в переменной уже будет значение чужого потока.
int main()
{
int thread;
int table[8] = { 0 };
omp_set_num_threads(8);
#pragma omp parallel private(thread)//всё, что дальше в скобках - будет запущено в 8 потоках одновременно
{ //потоки могут получать управление в произвольном порядке
thread = omp_get_thread_num(); //каждый поток получает свой номер
if (thread%2 ==0) //четные потоки записывают в табличку единицу
table[thread] = 1;
#pragma omp critical //критическая секция в один момент времени может выполняться только одним потоком
{ //это необходимо, чтобы печать из разных потоков не перемешивалась
std::cout << "Hello, I am thread no " << thread << std::endl;
std::cout << "My table value is" << table[thread] << std::endl;
} //потоки проходят секцию также в произвольной очередности
}
}