我正在学习pthread和等待条件.据我所知,一个典型的等待线程是这样的:
pthread_mutex_lock(&m);
while(!condition)
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Run Code Online (Sandbox Code Playgroud)
我无法理解的是,while(!condition)即使我pthread_cond_signal()用来唤醒线程,为什么这条线是必要的.
我可以理解,如果我使用pthread_cond_broadcast()我需要测试条件,因为我唤醒所有等待的线程,其中一个可以在解锁互斥锁之前再次使条件为假(从而将执行转移到另一个不应该执行的唤醒线程点).但是,如果我使用pthread_cond_signal()我只唤醒一个线程,所以条件必须是真的.所以代码看起来像这样:
pthread_mutex_lock(&m);
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Run Code Online (Sandbox Code Playgroud)
我读到了一些可能发生的虚假信号.这是(也是唯一的)原因吗?我为什么要有虚假的信号呢?或者还有其他我没有得到的东西?
我假设信号代码是这样的:
pthread_mutex_lock(&m);
condition = true;
pthread_cond_signal(&cond); // Should wake up *one* thread
pthread_mutex_unlock(&m);
Run Code Online (Sandbox Code Playgroud) 搜索过,但没有遇到令人满意的答案.
我知道没有一种可移植的方式来打印pthread_t.
你是如何在你的应用程序中做到的?
更新:
其实我不需要pthread_t,而是一些小的数字id,在调试消息中识别不同的线程.
在我的系统(64位RHEL 5.3)上,它被定义为unsigned long int,因此它是大数字,只是打印它在调试行中占有一席之地.gdb如何分配短时间?
我是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;
}
Run Code Online (Sandbox Code Playgroud)
我希望程序输出"42 \n",但它输出一个随机数.如何打印返回的值?
编辑: 根据第一个答案,问题是我返回指向局部变量的指针.返回/存储多个线程的变量的最佳做法是什么?全局哈希表?
提前致谢
我对如何使用pthread声明递归互斥锁感到困惑.我尝试做的是一次只有一个线程能够运行一段代码(包括函数)但是在怀疑之后我发现使用互斥量不起作用而我应该使用递归互斥锁.这是我的代码:
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
Run Code Online (Sandbox Code Playgroud)
所以我尝试做的只是串行读取/删除队列.
问题在于,没有任何关于如何声明递归互斥体的例子.或者可能有一些,但他们不为我编译.
在共享内存并行化方面,大多数科学计算人员使用OpenMP作为准标准.
是否有任何理由(除了可读性)使用OpenMP而不是pthreads?后者似乎更基本,我怀疑它可以更快更容易优化.
我是pthreads的新手,我正在努力理解它.我看到了一些如下例子.
我可以看到它main()被API阻止了pthread_exit(),我已经看到了主要功能被API阻止的示例pthread_join().我无法理解何时使用什么?
我指的是以下网站 - https://computing.llnl.gov/tutorials/pthreads/.我无法获得何时使用pthread_join()以及何时使用的概念pthread_exit().
有人可以解释一下吗?此外,pthreads的良好教程链接将不胜感激.
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 5
void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0; t<NUM_THREADS; t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", …Run Code Online (Sandbox Code Playgroud) 我有一个关于C并发编程的问题.
在pthread库中,原型pthread_join是
int pthread_join(pthread_t tid, void **ret);
Run Code Online (Sandbox Code Playgroud)
原型pthread_exit是:
void pthread_exit(void *ret);
Run Code Online (Sandbox Code Playgroud)
所以我很困惑,为什么pthread_join将进程的返回值作为void指向收到线程的指针的指针,但pthread_exit只void从指定的线程获取指针?我的意思是基本上它们都是来自线程的返回值,为什么类型有差异?
标题可能不够清晰,因为我不知道如何定义我的问题.
我理解Pthread是一个符合POSIX标准的线程库(关于POSIX,请参阅维基百科:http://en.wikipedia.org/wiki/Posix).它可以在类Unix操作系统中使用.
关于线程,我读到有三种不同的模型:
用户级线程:内核不知道它.用户自己创建/实现/销毁线程.
内核级线程:内核直接支持进程中的多个控制线程.
轻量级进程(LWP):由内核调度但可以与用户线程绑定.
你有没有看到我的困惑?当我调用pthread_create()创建一个线程时,我是否创建了一个用户级线程?大概吧.那么我可以说,Pthread为线程提供了用户级解决方案吗?它无法操纵内核/ LWP?
我很想知道如何在Unix中实现与线程之间的同步相关的函数.例如,当我打电话时会发生什么pthread_mutex_lock?有没有使用指针?对源代码的引用确实会有所帮助.
为什么POSIX互斥量被认为比futex更重或更慢?pthread互斥锁类型的开销来自哪里?我听说pthread互斥体基于互斥体,当无争议时,不要对内核进行任何调用.那时似乎pthread互斥体只是一个围绕futex的"包装器".
开销只是在函数包装调用中,并且需要互斥函数来"设置"futex(即,基本上是pthread互斥函数调用的堆栈设置)?或者pthread互斥锁是否有一些额外的内存屏障步骤?