Очень жаль, что люди не все такие потрясающие, как у нас, а? Может быть, они есть! Очень часто мне говорят, что оперативной памяти, безусловно, хорошо для скорости, но я не удивлюсь, если Quartz2D будет эксплуатировать добавил оперативной памяти. Как этому барану быть обработаны, чтобы получить в PDF выступлений от программиста ПОВ? Я думаю, это другой вопрос. Я, кажется, помню, что видел эту проблему раньше, но я считаю, что это явное проблему с другой. Речь не о чае в поездке, вопрос о химические процессы, которые разрушают его вкус и я после методов, которые предотвращают эти процессы. Пока я только выяснил, что масла на основе ароматизаторов отделяют от чая. Я обновил мой вопрос, появилась новая ошибка Я ищу, чтобы использовать пиво из бутылки как разрыхлитель. Я вижу, что я должен использовать фактический пекарских дрожжей, чтобы получить рост в дополнение к пиву (пивные дрожжи не будут работать)

Мьютекс-это отвлекающий маневр -- она является локальной для функции, и так оно на самом деле не что-нибудь замок, так там оказывается отдельный мьютекс для каждого потока. Для того, чтобы фактически заблокировать, вы должны двигаться мьютекс переменной из create_image.

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

Проблема на самом деле слчис(). Из моего тестирования, он имеет свой собственный внутренний мьютекс замок, который вызывает все замедление. Изменения с помощью функции RAND() для rand_r (и семян) и вся разница. Чем больше нитей используется, тем дороже замок становится (за один звонок), и поэтому вы наблюдаете замедление.

Сказав, что на мой процессор, создание ПНГ является доминирующей стоимость в этой программе. Без записи изображения в формате PNG, программа работает в соответствии с 2С (один поток) и масштабируется почти линейно с числом используемых ядер. При записи изображения в формате PNG, это время переходит к более 8С, поэтому и пишу в PNG изображение занимает гораздо больше времени, чем создание образа.

Вот что я придумал:

#включить <библиотеки iostream>
#включить <вектор>
#включить <нить>
#включить <мьютекс>
#включить <ПНГ++/ПНГ.ГЭС>
#включить <время.ч>

СТД::вектор<инт> границы(инт Макс, инт частей)
{
 СТД::вектор<инт> интервал;
 разрыв инт = Макс / частей;
 инт левый = Макс % деталей;
 инт nr1 = 0;
 инт nr2;

интервал.push_back(nr1);
 для (int я = 0; Я < части; я++)
{
 nr2 = nr1 + пробел;
 если (я == частей - 1)
 nr2 += влево;
 nr1 = nr2;
интервал.push_back(nr2);
}
 возврат интервала;
}

пустота create_image(ПНГ::образ<ПНГ::rgb_pixel> &изображения, начать инт, инт конца)
{
 неподписанные семян инт = время(нуль);
 для (int Я = начало; Я < конец; я++)
 для (Int J = 0 и J-это < изображения.get_height(); J++в)
 изображения[я][Дж] = ПНГ::rgb_pixel(rand_r (и семян) % 256, 0, rand_r (и семян) % 256);
}

тап_п()
{
 ПНГ::образ<ПНГ::rgb_pixel> png_image(6000, 6000); //создание образа
 инт части = 1; //количество параллельных потоков
 СТД::вектор<инт> my_vector = границы(png_image.get_width(), деталей); //интервал вектор
 СТД::вектор<СТД::резьба> рабочих; //потоки

 время начала, окончания;
 время (и начало); //время измерения
 для (int я = 0; Я < части; я++)
{
 работников.push_back(с std::нить(create_image, СТД:: (png_image Реф), my_vector[я], my_vector[я + 1]));
}
 для (int я = 0; Я < части; я++)
работников[я].присоединяйтесь к();

png_image.писать("тест.ПНГ");
время (и конца);
 с std::соиь << (конец - начало) << "секунд\п";

 возврат 0;
}