Как я могу напечатать строку в цикле (10 100, 1000 циклов), используя несколько потоков (2, 4, 8, 16 потоков) без синхронизации? - PullRequest
0 голосов
/ 15 октября 2019

Мне нужно написать программу, которая будет печатать символы на консоли. Потоки не должны быть синхронизированы, что означает, что данные будут смешаны, а выходные данные должны быть грязными. Тем не менее, мой вывод работает нормально, и кажется, что я делаю что-то не так.

typedef struct {
    std::string info;
    unsigned int m_number;
    unsigned m_cycles;
    unsigned m_currentThread;
}data;

unsigned int __stdcall Func(void* d) {
    data* real = (data*)d;
    std::cout << "Current thread ID: " << GetCurrentThreadId() << std::endl;
    int i = 0;
    for (int j = (real->m_currentThread - 1) * real->m_cycles / real->m_number;j < real->m_currentThread * real->m_cycles / real->m_number;j++) {
        std::cout << real->info << std::endl;
        }

    return 0;
}

int main(int argc, char* argv[]) {
    int threadsNumber;
    std::string str;
    std::getline(std::cin, str);
    std::cout << "Enter the number of threads:\n";
    std::cin >> threadsNumber;
    int cycles;
    std::cout << "Enter the number of cycles:\n";
    std::cin >> cycles;
    std::vector<HANDLE> threads;
    HANDLE tmp;
    data* args = new data;
    args->info = str;
    args->m_number = threadsNumber;
    args->m_cycles = cycles;
    for (int i = 1;i <= threadsNumber;++i) {
        args->m_currentThread = i;
        tmp = (HANDLE)_beginthreadex(0, 0, &Func, args, 0, 0);
        Sleep(1000L);
        threads.push_back(tmp);
    }
    WaitForMultipleObjects(threads.size(), &threads.front(), TRUE, INFINITE);

    getchar();
    return 0;
}

Вывод должен быть посимвольным, а строки должны быть запутанными, поскольку пока нет синхронизации между потоками.

1 Ответ

0 голосов
/ 03 ноября 2019

Вывод должен быть посимвольным, а строки должны быть запутанными

Это не подкреплено контрактом std::cout:

Если не было выпущено sync_with_stdio(false), безопасно одновременно обращаться к этим объектам из нескольких потоков как для форматированного, так и для неформатированного вывода.

Наблюдаемое поведение соответствует ожидаемому поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...