私の目標は、特定の関数が 2 つの別々のスレッドで同時に呼び出された場合に問題を引き起こす可能性があるさまざまな競合状態にすばやく対処することです。私のクイックフィックスは、関数が main() の前に呼び出されることによって初期化されていることを保証することです。これは私が思いついた解決策ですが、車輪を再発明する可能性が高いと感じています. MSVC2010 STL で既に利用可能なオプションはありますか? (ブーストはまだありません)または、この状況で各関数に重要なスレッドセーフコードを追加することなく、これらの問題に迅速に対処するより良い方法があるでしょうか?
template <typename T, T func>
struct PreLoaderHelper
{
PreLoaderHelper()
{
wcout << L"Preload helper constructor" << endl;
func();
}
};
template <typename T, T func>
struct PreLoader
{
static PreLoaderHelper<T, func> _helper;
};
template <typename T, T func>
PreLoaderHelper<T, func> PreLoader<T, func>::_helper;
#define PRELOAD(fn) template struct PreLoader<decltype(&fn), fn>;
void foo() { wcout << L"inside foo" << endl; }
void bar() { wcout << L"inside bar" << endl; }
vector<wstring> & foobar()
{
static vector<wstring> sPresidents;
if(sPresidents.size() == 0)
{
sPresidents.push_back(L"George Washington");
sPresidents.push_back(L"John Addams");
sPresidents.push_back(L"Thomas Jefferson");
}
return sPresidents;
}
wstring foofoo(const wstring &) { wcout << L"inside foofoo" << endl; return L"foofoo";}
PRELOAD(foo);
PRELOAD(bar);
PRELOAD(foobar);
PRELOAD(foo);
int main()
{
return 0;
}