向线程池中线程函数传递结构体参数的问题
- pthread_mutex_t mutex;
- struct TEST {
- char str[10];
- int num;
- };
- void dispatch_threadpool_to_me(void *arg) {
- pthread_mutex_lock( &mutex );
- TEST test;
- /*为传入的结构体变量复制一个副本*/
- memcpy( &test, ( TEST* )arg, sizeof( TEST ) );
- pthread_mutex_unlock( &mutex );
- sleep(4);
- printf( "%s,%d\n", test.str, test.num );
- }
- int main(int argc, char **argv) {
- threadpool tp;
- TEST test;
- /*初始化互斥量*/
- if ( pthread_mutex_init( &mutex, NULL ) == 0 )
- {
- printf( "pthread_mutex_init ok\n" );
- }
- else
- {
- return 0;
- }
- /*线程池最大工作线程为10个*/
- tp = create_threadpool(10);
- for ( int i = 0; i < 100; i++ )
- {
- sprintf( test.str, "%d", i );
- test.num = i;
- /*投入线程*/
- dispatch_threadpool(tp, dispatch_threadpool_to_me, (void *) &test );
- }
- /*销毁线程池*/
- destroy_threadpool( tp );
- }
复制代码打印结果:
0,0
1,1
2,2
3,3
4,4
5,5
6,6
7,7
8,8
9,9
20,20
20,20
20,20
20,20
20,20
20,20
20,20
20,20
20,20
20,20
这段代码的问题出在dispatch_threadpool_to_me线程函数的printf中,现象为printf为重复打印 i 的值。但是我已经使用互斥量来保证每个线程函数中都有一个独立的结构体副本,为什么还会出现这样的问题呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
用同一个结构体,肯定会有问题,第N个线程可能还没打印,第N+1个已经把它修改了。
100个线程就100哥TEST对象吧