user-0 提问: 多线程并发服务器线程创建函数malloc参数问题

回复:
user: user-1
content: 做了个程序实验了一下。5L是对的，你的每个threadArg变量在while循环回来之后都被释放掉了。于是每个线程得到的参数可能会访问同一个位置，里面参数是否正确取决于后面的程序有没有继续使用堆栈。如果你后面传输的东西是需要在新线程里用到的，建议建个数据结构分配内存。如果就用一下数值本身，可以考虑使用传值的方式~

user: user-2
content: 搜“内存池”，“线程池”，“连接池”

user: user-3
content: 引用 5 楼 xihu1364 的回复:[quote=引用 4 楼 bbs2241 的回复:] [quote=引用 3 楼 xihu1364 的回复:] [quote=引用 2 楼 bbs2241 的回复:] int threadArg = connfd; pthread_create(&tid, NULL, ThreadFunction, &threadArg)  既然是int变量直接传就好了 pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)  也可以使用线程局部存储TLB   ... 进入下次while循环局部变量已经销毁，创建的线程去使用销毁的变量，不会有事？ 看到创建线程的时候是传的变量的地址，不是值...[/quote]  pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg) 参数都进栈了，那还有多线程问题。  ThreadFunction中直接将threadArg强转会int不就可以了[/quote]   呵呵，你知道进栈了，是进了什么吗？是threadArg的地址而不是值 如：threadArg的地址 0x11111111 其对应的值是3  进入ThreadFunction栈中了，但是还没执行ThreadFunction，这是while进入下次循环，threadArg已经析构，threadArg的地址还在，（内存地址肯定还在那）但是值可能被其他程序修改。 当ThreadFunction执行的时候，按你说的，int* p = （int*）pParam 这时候 p是指向0x11111111 而*p还是会等于3吗？？ 这个就不一定了  不知道 你能看懂不[/quote] 你也没认真看，bbs2241说的是改为pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)。(void *)threadArg当然不会有事。

user: user-0
content: 引用 2 楼 bbs2241 的回复:int threadArg = connfd; pthread_create(&tid, NULL, ThreadFunction, &threadArg)  既然是int变量直接传就好了 pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)  也可以使用线程局部存储TLB 这个方法确实行的通，但是用int型值当做指针来用，恐怕有危险吧 PS:刚才引用1楼引用错了

user: user-0
content: 引用 1 楼 xihu1364 的回复:int threadArg是局部变量  当while进入下一次循环，这个变量就被销毁了，创建的线程去读这个变量是未定义行为 这个方法确实行的通，但是用int型值当做指针来用，恐怕有危险吧

user: user-4
content: 引用 3 楼 xihu1364 的回复:[quote=引用 2 楼 bbs2241 的回复:] int threadArg = connfd; pthread_create(&tid, NULL, ThreadFunction, &threadArg)  既然是int变量直接传就好了 pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)  也可以使用线程局部存储TLB  ... 进入下次while循环局部变量已经销毁，创建的线程去使用销毁的变量，不会有事？ 看到创建线程的时候是传的变量的地址，不是值...[/quote]  pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg) 参数都进栈了，那还有多线程问题。  ThreadFunction中直接将threadArg强转会int不就可以了

user: user-5
content: 引用 2 楼 bbs2241 的回复:int threadArg = connfd; pthread_create(&tid, NULL, ThreadFunction, &threadArg)  既然是int变量直接传就好了 pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)  也可以使用线程局部存储TLB  ... 进入下次while循环局部变量已经销毁，创建的线程去使用销毁的变量，不会有事？ 看到创建线程的时候是传的变量的地址，不是值...

user: user-4
content: int threadArg = connfd; pthread_create(&tid, NULL, ThreadFunction, &threadArg)  既然是int变量直接传就好了 pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)  也可以使用线程局部存储TLB

user: user-5
content: int threadArg是局部变量  当while进入下一次循环，这个变量就被销毁了，创建的线程去读这个变量是未定义行为

user: user-6
content: 2 楼正解, 5楼还没看明白.

user: user-5
content: 引用 4 楼 bbs2241 的回复:[quote=引用 3 楼 xihu1364 的回复:] [quote=引用 2 楼 bbs2241 的回复:] int threadArg = connfd; pthread_create(&tid, NULL, ThreadFunction, &threadArg)  既然是int变量直接传就好了 pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)  也可以使用线程局部存储TLB   ... 进入下次while循环局部变量已经销毁，创建的线程去使用销毁的变量，不会有事？ 看到创建线程的时候是传的变量的地址，不是值...[/quote]  pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg) 参数都进栈了，那还有多线程问题。  ThreadFunction中直接将threadArg强转会int不就可以了[/quote]   呵呵，你知道进栈了，是进了什么吗？是threadArg的地址而不是值 如：threadArg的地址 0x11111111 其对应的值是3  进入ThreadFunction栈中了，但是还没执行ThreadFunction，这是while进入下次循环，threadArg已经析构，threadArg的地址还在，（内存地址肯定还在那）但是值可能被其他程序修改。 当ThreadFunction执行的时候，按你说的，int* p = （int*）pParam 这时候 p是指向0x11111111 而*p还是会等于3吗？？ 这个就不一定了  不知道 你能看懂不