Tag: pthreads

有没有一个无效的pthread_t编号?

我想调用pthread_join给定的线程ID,但只有当该线程已经启动。 安全的解决scheme可能是添加一个variables来跟踪哪个线程开始或不开始。 不过,我不知道检查pthread_tvariables是可能的,像下面的代码。 pthread_t thr1 = some_invalid_value; //0 ? pthread_t thr2 = some_invalid_value; /* thread 1 and 2 are strated or not depending on various condition */ …. /* cleanup */ if(thr1 != some_invalid_value) pthread_join(&thr1); if(thr2 != some_invalid_value) pthread_join(&thr2); 其中some_invalid_value可以是0,或者一个实现依赖的“PTHREAD_INVALID_ID”macros PS:我的假设是,pthread_ttypes是可比的,可分配的,假设基于 PPS:我想这样做,因为我认为调用无效的线程ID pthread_join是undefinde行为。 不是这样。 但是,join之前join的线程是未定义的行为。 现在让我们假设重复调用上面的“function”。 无条件地调用pthread_join并检查结果可能会导致在以前连接的线程上调用pthread_join。

你如何查询一个pthread,看看它是否仍在运行?

在我的析构函数中,我想干净地破坏一个线程。 我的目标是等待一个线程完成执行,然后破坏线程。 我发现查询pthread的唯一情况是pthread_attr_setdetachstate,但是这只能告诉你,如果你的线程是: PTHREAD_CREATE_DETACHED PTHREAD_CREATE_JOINABLE 这两者与线程是否仍在运行无关。 你如何查询一个pthread,看看它是否仍在运行?

C:你如何用POSIX线程声明一个recursion互斥?

我有点困惑如何使用pthread声明一个recursion互斥。 我试图做的是一次只能有一个线程能够运行一段代码(包括函数),但是在怀疑之后,我发现互斥锁的使用将不起作用,而我应该使用recursion互斥体(recursive mutexes)。 这是我的代码: pthread_mutex_lock(&mutex); // LOCK item = queue_peek(queue); // get last item in queue item_buff=item; // save item to a buffer queue_removelast(queue); // remove last item from queue pthread_mutex_unlock(&mutex); // UNLOCK 所以我试图做的只是连续读取/从队列中删除。 关于如何声明recursion互斥体,没有任何例子。 或者也许有一些,但他们不为我编译。

如何从C中的线程返回一个值

我是新来的C,并想玩一些线程。 我想使用pthread_exit()从一个线程返回一些值 我的代码如下: #include <pthread.h> #include <stdio.h> void *myThread() { int ret = 42; pthread_exit(&ret); } int main() { pthread_t tid; void *status; pthread_create(&tid, NULL, myThread, NULL); pthread_join(tid, &status); printf("%d\n",*(int*)status); return 0; } 我期望程序输出“42 \ n”,但它输出一个随机数。 我怎样才能打印返回的值? 编辑:根据第一个答案的问题是,我正在返回指向本地variables的指针。 返回/存储multithreadingvariables的最佳做法是什么? 全局哈希表? 提前致谢

我需要-D_REENTRANT和-threads?

在Linux(内核2.6.5)上,我们的构build系统使用-D_REENTRANT调用gcc。 使用pthreads时,这仍然是必需的吗? 它与gcc -pthread选项有什么关系? 我知道我应该使用pthread和pthread,我还需要-D_REENTRANT吗? 在附注中,你知道在gcc 3.3.3和gcc 4.xx之间使用REENTRANT有什么区别吗? 当我使用-pthread gcc选项时,我可以看到_REENTRANT被定义。 从命令行中省略-D_REENTRANT会产生什么影响,例如,某些对象是否可以在没有multithreading支持的情况下进行编译,然后链接到使用pthreads的二进制文件中并导致问题? 我认为应该可以使用: g++ -pthread > echo | g++ -E -dM -c – > singlethreaded > echo | g++ -pthread -E -dM -c – > multithreaded > diff singlethreaded multithreaded 39a40 > #define _REENTRANT 1 我们正在编译多个静态库和与静态库链接的应用程序,库和应用程序使用pthreads。 我相信这在过去的某个阶段是需要的,但是想知道它是否仍然是必需的。 谷歌search没有返回任何最近的信息提及 – D_REENTRANT pthreads 。 你能指向我的链接或参考讨论在最新版本的内核/ gcc / pthread的使用 […]

Pthreads与OpenMP

我使用Linux在C中创build一个multithreading应用程序。 我不确定是否应该使用POSIX线程API或OpenMP API。 什么是使用两者的优点和缺点? 编辑: 有人可以澄清这两个API是创build内核级还是用户级线程?

并行化:pthreads还是OpenMP?

科学计算中的大多数人在共享内存并行化方面使用OpenMP作为准标准。 有没有任何理由(除了可读性)通过pthreads使用OpenMP? 后者似乎更基本,我怀疑它可以更快,更容易优化。

我可以得到Unix的pthread.h在Windows中编译?

如果我尝试编译一个程序 #include <pthread.h> 在其中,我得到的错误: pthread.h: No such file or directory 是否有可能得到这个在Windows环境下编译? 我正在用最新的MinGW使用Vista。 我不想使用Microsoft Windows Services for UNIX版本3.5,因为我将不得不将它移到Unix环境中。

是否有可能确定持有互斥体的线程?

首先,我使用pthread库来编写multithreadingC程序。 线程总是挂在等待的互斥体上。 当我使用strace实用程序来查找一个线程处于FUTEX_WAIT状态时,我想知道哪个线程在那个时候持有该互斥体。 但我不知道该怎么做。 有没有公​​用事业可以做到这一点? 有人告诉我,Java虚拟机支持这个,所以我想知道Linux是否支持这个function。

如何打印pthread_t

search,但没有遇到一个令人满意的答案。 我知道没有一种便携的方式来打印pthread_t。 你如何在你的应用程序中做到这一点? 更新: 其实我不需要pthread_t,但一些小的数字ID,在debugging消息中标识不同的线程。 在我的系统上(64位RHEL 5.3),它被定义为unsigned long int,所以它是大数字,只是打印它在debugging行中吃了一个宝贵的地方。 gdb如何分配 short tids?