向线程池中线程函数传递结构体参数的问题

发布于 2022-10-15 06:25:35 字数 2078 浏览 20 评论 0

  1. pthread_mutex_t mutex;
  2. struct TEST {
  3.     char str[10];
  4.     int num;
  5. };
  6. void dispatch_threadpool_to_me(void *arg) {
  7.     pthread_mutex_lock( &mutex );
  8.     TEST test;
  9.     /*为传入的结构体变量复制一个副本*/
  10.     memcpy( &test, ( TEST* )arg, sizeof( TEST ) );
  11.     pthread_mutex_unlock( &mutex );
  12.     sleep(4);
  13.     printf( "%s,%d\n", test.str, test.num );
  14. }
  15. int main(int argc, char **argv) {
  16.   threadpool tp;
  17.   TEST test;
  18.   /*初始化互斥量*/
  19.   if ( pthread_mutex_init( &mutex, NULL ) == 0 )
  20.   {
  21.       printf( "pthread_mutex_init ok\n" );
  22.   }
  23.   else
  24.   {
  25.       return 0;
  26.   }
  27.   /*线程池最大工作线程为10个*/
  28.   tp = create_threadpool(10);
  29.   for ( int i = 0; i < 100; i++ )
  30.   {
  31.       sprintf( test.str, "%d", i );
  32.       test.num = i;
  33.       /*投入线程*/
  34.       dispatch_threadpool(tp, dispatch_threadpool_to_me, (void *) &test );
  35.   }
  36.   /*销毁线程池*/
  37.   destroy_threadpool( tp );
  38. }

复制代码打印结果:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

霞映澄塘 2022-10-22 06:25:35

用同一个结构体,肯定会有问题,第N个线程可能还没打印,第N+1个已经把它修改了。
100个线程就100哥TEST对象吧

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文