【发布时间】: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 完成后才释放?
标签: .net c visual-studio-2003 pthreads