繁体   English   中英

在VS .NET 2003中使用pthread

[英]Using pthreads in VS .NET 2003

我在VS .NET 2003中的程序遇到一些问题。

我最初编写了一个模块,该模块使用pthread库创建许多线程来处理某些事情。 这可以在VS .NET 2003中正确运行。然后该模块被其他人使用,并集成到另一个更大的程序中。 我不确定细节,但是程序创建了一个GUI,允许用户选择一个选项来运行我的模块。

创建线程时,将传入一个值作为线程ID。 我的模块在GUI中的问题是所有线程的线程ID的值为0,而在没有GUI的模块中线程ID是正确的。

这是在模块中创建线程的方式:

int64_t *tid[1000];
int64_t i = 0, rc;

for (i = 0 ; i < NUM_THREADS ; i++)
{
   tid[i] = (int64_t *) malloc(sizeof(int64_t));
   *tid[i] = i;
   rc = pthread_create(&pthread, &attr, function, (void *)tid[i]);
   Sleep(1);
   if(rc)
   {
      free(tid[i]);
      exit(1);
   }
   free(tid[i]);
}

我检查了两个项目的属性,下面列出了两个项目之间的唯一区别:

GUI - use managed extensions | my module (w/o GUI) - does not use managed extensions
In C/C++ preprocessor:
   GUI - WIN32;_DEBUG;_CONSOLE;WINDOWS | my module (w/o GUI) - none
In C/C++ Additional Options:
   GUI - /CLR | my module (w/o GUI) - no /CLR (error with /CLR: fatal error LNK1000: Internal error during BuildImage)

代码是一样的,所以我不明白为什么GUI的输出是错误的,除非使用托管扩展/ clr有所不同? (我也不是很清楚。)

编辑添加了输出线程ID的代码部分:

void *function(void *input)
{
   int64_t threadid = *(int64_t *)input;
   printf("threadid = %ld\n", threadid);
   ...
}

请指教。

谢谢。

问候,雷恩

将tid传递给函数时,您似乎处于竞争状态-尝试删除Sleep(1)并使用无线程tid。 从上面的评论来看,这似乎可以解决问题。

为了回答您的另一个问题,当pthread_create返回到主线程时,已经创建了新线程(已为OS中的线程分配了内存等),但实际上可能尚未运行。 放置Sleep(1)使得新线程更有可能运行(强制主线程放弃时间片),但是不能保证线程会在主线程再次运行并调用free(tid [i])之前获得tid。

因此,使工作线程空闲tid的想法-拾取它后将释放。

如果将tid数组更改为int64的数组并传递&tid [i],则将不需要malloc / free并且竞争条件也已解决-尽管只有在保证只有一个调用方的情况下,此方法才有效一次图书馆。

我希望这会有所帮助-正确执行线程可能会很棘手,但值得付出努力!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM