在 VS .NET 2003 中使用 pthread
Posted
技术标签:
【中文标题】在 VS .NET 2003 中使用 pthread【英文标题】:Using pthreads in VS .NET 2003 【发布时间】:2010-03-03 03:10:16 【问题描述】:我在 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);
...
请指教。
谢谢。
问候, 雷恩
【问题讨论】:
pthreads 库是从 Unix 到 Win32 的端口吗? 是的,但是如果模块在没有 GUI 的情况下也能正常工作,那么问题是什么? 你能展示你的线程函数中读取 tid 参数的部分吗? 不确定这是否与您的问题有关,但线程启动中存在竞争条件 - 您在传递 tid[i] 后释放它,并使用 Sleep(1) 强制新线程跑。作为一个快速破解,尝试 Sleep(1000) 以查看此竞争条件是否相关 - 可能需要握手或让线程释放 tid。这有帮助吗? 正如你所说,这似乎是一个竞争条件,所以我让线程释放了 tid。谢谢!我认为这种使用 tid 的方法应该解决竞争条件问题,而不是简单地使用 pthread_create(&pthread, &attr, function, (void *)&i);为什么 tid[i] 只有在 pthread_create 完成后才释放? 【参考方案1】:在将 tid 传递给函数时,您似乎遇到了竞争条件 - 尝试删除 Sleep(1) 并改为使用线程空闲 tid。从您上面的评论来看,这似乎解决了问题。
为了回答您的其他问题,当 pthread_create 返回您的主线程时,新线程已创建(为操作系统中的线程分配的内存等)但可能尚未实际运行。设置 Sleep(1) 使新线程更有可能运行(强制主线程放弃时间片),但不能保证线程在主线程再次运行并调用 free(tid[i]) 之前得到 tid;
因此产生了让工作线程释放 tid 的想法 - 它将在拾取后释放。
如果您将 tid 数组更改为 int64 数组并传递 &tid[i] 那么您将不需要 malloc/free 并且竞争条件也得到了解决 - 尽管这仅在您保证只有一个时才有效立即调用您的图书馆。
我希望这会有所帮助 - 正确处理线程可能很棘手,但值得付出努力!
【讨论】:
以上是关于在 VS .NET 2003 中使用 pthread的主要内容,如果未能解决你的问题,请参考以下文章
如何解决“Visual Studio .Net 无法创建或打开应用程序 VS2003”的问题?