我碰到一個醒目的std :: invalid_argument不同的是,我不能追蹤的問題。我使用的是gcc 4.4.0(windows),pthreads-win32 2.8.0 GC2 dll。無法趕上的std :: invalid_argument
基本上,從兩個線程(主線程和線程開始使用在pthread_create),我嘗試在大致相同的時間來創建一個類的實例。構造函數拋出一個std :: invalid_argument,但它被try/catch塊包圍,它應該捕獲異常。但是,這並沒有發生(很少,只有其中一個線程可能會發現異常 - 沒有關於哪個會執行的規則)
如果我只嘗試在其中一個線程上創建對象,則創建按原樣工作,並發現異常。如果我在不同的時間創建這兩個對象,則該創建將按其應有的方式工作,並捕獲異常。如果我嘗試同時創建它們,:: terminate()會被調用。
也許有人有爲什麼會這樣的想法(我已經排除頭):
void *run(void *ptr)
{
Sleep(5000);
try
{
A *a = new A(5);
a->a = 12;
}
catch (std::exception &ex)
{
printf("t - %s\n", ex.what());
}
return NULL;
}
int main(void) {
pthread_t t;
if (pthread_create(&t, NULL, run, NULL) != 0)
{
printf("No thread\n");
}
else
{
Sleep(5000);
try
{
A *a = new A(5);
a->a = 13;
} catch (std::exception &ex)
{
printf("M - %s\n", ex.what());
}
pthread_join(t, NULL);
}
return 0;
}
class A
{
public:
A(int a);
virtual ~A();
int a;
};
A::A(int a)
{
throw std::invalid_argument("Invalid!");
}
A::~A(){}
生成文件是:
CXXFLAGS = -O0 -g -Wall -Werror -fmessage-length=0
OBJS = WOpenTest.o A.o
INCL = -I../pthreads-win32/include
LIBS = -lws2_32 -lgdi32 -lpthreadGC2
LIB_DIRS = -L ../pthreads-win32/lib
TARGET = WOpenTest.exe
$(TARGET): $(OBJS)
$(CXX) -o $(TARGET) $(OBJS) $(LIBS) $(LIB_DIRS) $(INCL)
WOpenTest.o : WOpenTest.cpp
g++ $(CXXFLAGS) -c WOpenTest.cpp $(INCL)
A.o : A.cpp A.h
g++ $(CXXFLAGS) -c A.cpp $(INCL)
all: $(TARGET)
clean:
rm -f $(OBJS) $(TARGET)
我看到輸出:
(最常見)$ ./WOpenTest.exe
此應用程序已請求 運行時終止它在一個不尋常的方式 。請聯繫應用程序的 支持團隊以獲取更多信息。
此應用程序請求 運行時終止它在一個不尋常的 方式。請聯繫應用程序的 支持團隊以獲取更多信息。 終止拋 '的std :: invalid_argument' 的 實例 終止遞歸調用
或
$ ./WOpenTest.exe
此應用程序已請求 運行後叫終止它在一個不尋常的 方式。請聯繫應用程序的 支持團隊以獲取更多信息。 M - 無效!
或
$ ./WOpenTest.exe
此應用程序已請求 運行時終止它在一個不尋常的方式 。請聯繫應用程序的 支持團隊以獲取更多信息。 t - 無效!
或
此應用程序已請求 運行時終止它在一個不尋常的方式 。請聯繫應用程序的 支持團隊以獲取更多信息。
此應用程序請求 運行時終止它在一個不尋常的 方式。請聯繫應用程序的 支持團隊以獲取更多信息。 終止調用後拋出一個 實例'std :: invalid_argument'
什麼():無效!
任何想法,我應該做什麼,我不是?或者我錯過了pthreads?
我已經找到了答案,把它歸結爲MinGW的MSVCRT不是線程安全的。 – laura 2009-09-04 10:09:10