我目前正在使用Windows线程库。我想将一个全局列表作为参数传递给我的一个子线程,并将其推送到该列表(允许我的主线程访问它)。
这基本上就是我所拥有的:
std::list<SOCKET> mylist;
typedef struct {
std::list<SOCKET>* listPtr;
SOCKET listenSocket;
} buffer;
main_thread() {
...
Set up SOCKET socket = listen(...)
...
buffer* buf = new buffer();
buffer->listPtr = &mylist;
buffer->listenSocket = socket;
CreateThread(NULL, 0, child_thread, (void*)buffer, NULL, NULL);
}
child_thread(void* args) {
buffer* buf = (buffer*) args;
std::list<SOCKET> list = *(buf->listPtr);
list.push_back(NULL);
}
问题是我在子线程中改变了我的列表后,主线程没有看到任何这些更改。我不明白为什么不这样做,我将我的全局列表的地址传递给我的子线程,所以我在这个列表中对子线程所做的任何事都应该反映在我的全局列表中,正确?
答案 0 :(得分:1)
您正在此处创建列表的副本:
std::list<SOCKET> list = *(buf->listPtr);
试试这个
std::list<SOCKET> *list = buf->listPtr;
list->push_back(NULL);