Он называется привязкой к троекрату или цепочке конструкторов Teleescoping Constructor. Да, вы можете это сделать. Я вижу много примеров выше, и я хочу добавить, сказав, что если вы знаете, что вам нужен только два или три конструктора, возможно, все в порядке. Но если вам нужно больше, попробуйте использовать другой шаблон дизайна, такой как шаблон Builder. Например:
public Omar(){};
public Omar(a){};
public Omar(a,b){};
public Omar(a,b,c){};
public Omar(a,b,c,d){};
...
Вам может потребоваться больше. В этом случае лучшим вариантом будет шаблон Builder. Вот статья, может быть полезно https://medium.com/@modestofiguereo/design-patterns-2-the-builder-pattern-and-the-telescoping-constructor-anti-pattern-60a33de7522e
//may return 0 when not able to detect
unsigned concurentThreadsSupported = std::thread::hardware_concurrency();
Ссылка: станд.:: поток:: <час> hardware_concurrency
В C++ до C++ 11, нет никакого портативного пути. Вместо этого необходимо будет использовать один или несколько следующих методов (охраняемый соответствующим #ifdef
строки):
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
int numCPU = sysinfo.dwNumberOfProcessors;
int numCPU = sysconf(_SC_NPROCESSORS_ONLN);
int mib[4];
int numCPU;
std::size_t len = sizeof(numCPU);
/* set the mib for hw.ncpu */
mib[0] = CTL_HW;
mib[1] = HW_AVAILCPU; // alternatively, try HW_NCPU;
/* get the number of CPUs from the system */
sysctl(mib, 2, &numCPU, &len, NULL, 0);
if (numCPU < 1)
{
mib[1] = HW_NCPU;
sysctl(mib, 2, &numCPU, &len, NULL, 0);
if (numCPU < 1)
numCPU = 1;
}
int numCPU = mpctl(MPC_GETNUMSPUS, NULL, NULL);
int numCPU = sysconf(_SC_NPROC_ONLN);
NSUInteger a = [[NSProcessInfo processInfo] processorCount];
NSUInteger b = [[NSProcessInfo processInfo] activeProcessorCount];
На Linux лучший программируемый путь, насколько я знаю, состоит в том, чтобы использовать
sysconf(_SC_NPROCESSORS_CONF)
, или
sysconf(_SC_NPROCESSORS_ONLN)
Они не являются стандартными, но находятся в моей странице справочника для Linux.
Вы, вероятно, не будете в состоянии получить его независимым от платформы путем. Windows Вы получаете количество процессоров.
Windows Server 2003 и позже позволяет Вам усилить функцию GetLogicalProcessorInformation
На Linux можно считать/proc/cpuinfo файл и считать ядра.
Если у Вас есть доступ ассемблера, можно использовать инструкцию CPUID получить все виды информации о ЦП. Это портативно между операционными системами, хотя необходимо будет использовать определенную для производителя информацию, чтобы определить, как найти количество ядер. Вот документ, который описывает, как сделать это на процессорах Intel , и страница 11 этот описывает спецификацию AMD.
Эта функциональность является частью C++ 11 стандартов.
#include <thread>
unsigned int nthreads = std::thread::hardware_concurrency();
Для более старых компиляторов, можно использовать эти Повышение. Библиотека Thread .
#include <boost/thread.hpp>
unsigned int nthreads = boost::thread::hardware_concurrency();
В любом случае, hardware_concurrency()
возвраты количество потоков, что аппаратные средства способны к выполнению одновременно на основе количества единиц гиперпоточности и ядер процессора.
Еще один рецепт Windows: используйте переменную среды в масштабе всей системы NUMBER_OF_PROCESSORS
:
printf("%d\n", atoi(getenv("NUMBER_OF_PROCESSORS")));
можно использовать WMI в .net также, но Вы тогда зависите от wmi сервиса, работающего и т.д. Иногда, это работает локально, но тогда перестали работать, когда тот же код выполняется на серверах. Я полагаю, что это - проблема пространства имен, связанная с "именами", значения которых Вы читаете.
Обратите внимание, что "количество ядер" не могло бы быть особенно полезным числом, Вам, возможно, придется квалифицировать его немного больше. Как Вы хотите считать многопоточные центральные процессоры, такие как Intel HT, IBM Power5 и Power6, и наиболее заметно, Niagara/UltraSparc T1 Sun и T2? Или еще более интересный, MIPS 1004k с его двумя уровнями аппаратной поточной обработки (супервизор И уровень пользователя)... Не говоря уже о том, что происходит, когда Вы перемещаетесь в поддерживаемые гипервизором системы, где аппаратные средства могли бы иметь десятки центральных процессоров, но Ваша конкретная ОС только видит некоторых.
лучшее, на которое можно надеяться, должно сказать количеству логических блоков обработки, что Вы имеете в своем локальном разделе ОС. Забудьте о наблюдении истинной машины, если Вы не гипервизор. Единственное исключение к этому правилу сегодня находится на земле x86, но конец невиртуальных машин прибывает быстро...
OpenMP поддерживается на многих платформах (включая Visual Studio 2005), и это предлагает
int omp_get_num_procs();
функция, которая возвращает количество процессоров/ядер, доступных во время вызова.
В Linux Вы можете контроль dmesg и фильтровать строки, где ACPI инициализирует центральные процессоры, что-то как:
dmesg | grep 'ACPI: Processor
'
Другая возможность состоит в том, чтобы использовать dmidecode для отфильтровывания информации о процессоре.
Альтернатива OS X: описанное ранее решение на основе [[NSProcessInfo processInfo] processorCount] доступно только в OS X 10.5.0, согласно документации. Для более ранних версий OS X используйте функцию Carbon MPProcessors ().
Если вы программист какао, не пугайтесь того факта, что это Carbon. Вам просто нужно добавить фреймворк Carbon в ваш проект Xcode, и MPProcessors () будет доступен.
(Почти) Независимая от платформы функция в c-коде
#ifdef _WIN32
#include <windows.h>
#elif MACOS
#include <sys/param.h>
#include <sys/sysctl.h>
#else
#include <unistd.h>
#endif
int getNumCores() {
#ifdef WIN32
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
return sysinfo.dwNumberOfProcessors;
#elif MACOS
int nm[2];
size_t len = 4;
uint32_t count;
nm[0] = CTL_HW; nm[1] = HW_AVAILCPU;
sysctl(nm, 2, &count, &len, NULL, 0);
if(count < 1) {
nm[1] = HW_NCPU;
sysctl(nm, 2, &count, &len, NULL, 0);
if(count < 1) { count = 1; }
}
return count;
#else
return sysconf(_SC_NPROCESSORS_ONLN);
#endif
}