Hi Lance,
I am have exactly the same problem mentioned here. I can send you sample application where the problem can be reproduced.
I realized that Geodatabase API C++ is not multi-thread. But as mentioned here if is called from a working thread, the second time for me it would crash. I always make sure that I close the database before starting the second call.
Interestingly, it does NOT crash if I used std:::async() but it does crash if I use AfxBeginThread().
Here is a code snippet.
struct data { Geodatabase m_geodatabase; std::wstring m_name; }; UINT create(LPVOID param) { data *pObject = reinterpret_cast<data*>(param); if (pObject == nullptr) { return 0; } // Create a new geodatabase in the current directory. fgdbError hr; std::wstring errorText; { try { if ((hr = CreateGeodatabase(pObject->m_name, pObject->m_geodatabase)) != S_OK) { ErrorInfo::GetErrorDescription(hr, errorText); return -1; } } catch (...) { } } CloseGeodatabase(pObject->m_geodatabase); delete pObject; pObject = nullptr; return 0; } void CTestGeoDlg::OnBnClickedButton1() { data *d = new data; d->m_name = m_name1; // TODO: Add your control notification handler code here // create( d); std::async(create, d); // AfxBeginThread(create, d); } void CTestGeoDlg::OnBnClickedButton2() { data *d = new data; d->m_name = m_name2; // TODO: Add your control notification handler code here // create( d); std::async(create, d); //AfxBeginThread(create, d); } {
m_name1 and m_name2 are different. The files get created but then crash.
Lance,
I have found the solution to this issue. It's to do with how you access the libxml for the first time. If you access it from a thread other than the main thread then there can be issues unless xmlInitParser() has been called first. See the following web page.
http://www.xmlsoft.org/threads.html
Is there any chance that you could add a function (e.g. FileGDBAPI::Initialize) that applications could call from the main thread. This function would call xmlInitParser() and any other required initialization.
Here is what I have found related to threading and the FGDB library. I'm using a Java wrapper.
When using the thread monitor 1 I always synchronize on 2 first. That way you avoid deadlocking situations of holding the lock for 2 while getting 1.
FYI with the above strategy I've been able to develop multi-threaded applications with 20 threads that create 400 file GDB files.