Я играю с некоторыми потоками Boost, и я написал следующий код:
#include <boost/thread.hpp>
#include <iostream>
volatile int threads = 0;
const int iterations = 200;
volatile char output[iterations*4];
volatile int k = 0;
void w() {
threads++;
for (int i = 0; i < iterations; i++) {
k++;
output[k] = '0';
}
}
void y() {
threads++;
for (int i = 0; i < iterations; i++) {
k++;
output[k] = '1';
}
}
int main(int argc, char* argv[]) {
boost::thread a(&w);
boost::thread b(&w);
boost::thread c(&y);
boost::thread d(&y);
while (k <= iterations * 4) {}
for (int i=0; i < k; i++) {
std::cout << output[i];
}
return 0;
}
Чего я не понимаю, так это того, почему завершение этих потоков стало ждать друг друга, это показано в выходных данных:
000000000000000000000000000000000000000011111111
У меня сложилось впечатление, что выходные данные будут в случайном порядке, а операторы будут выглядеть примерно так (ожидаемый результат):
00100000111001000000010001111100000000011111111
Вместо них следуют все 0, затем все 1 (или наоборот).
Почему это так?На данный момент кажется, что потоки расположены в случайном порядке, но все еще объединены;т.е. ждем друг друга перед выполнением.Я действительно ожидал, что код потоков ++, возможно, будет запускаться одновременно в некоторых потоках, оставляя их с некоторым значением thisthread.
Отказ от ответственности: я очень новичок в Boost: потоки, просто играя, я понимаю расуусловия очень опасны (могут привести к неопределенному поведению), я просто кладу руку в огонь, чтобы я мог это понять.