pthreads 相关问题

Pthreads(POSIX Threads)是一个标准化的基于C的API,用于创建和操作线程。它目前由POSIX.1-2008(IEEE Std 1003.1,2013 Edition / The Open Group Base Specifications Issue 7)定义。

是否需要调用pthread_join()

我从 main() 创建了超过 100 个线程,所以我只是想知道在退出 main() 之前是否需要调用 pthread_join() 。 另外,我不需要这些线程生成的数据,基本...

回答 7 投票 0

如何制作timer_create和timer_delete多线程证明

我陷入了一种特殊的情况,我从一个线程调用timer_create并从另一个线程调用timer_delete。但我似乎无法让它工作,因为它最终陷入僵局: 我想不通...

回答 1 投票 0

C 中的多写入器线程安全队列

我正在使用 pthreads 开发多线程 C 应用程序。我有一个线程写入数据库(数据库库只能安全地在单个线程中使用),还有几个线程......

回答 4 投票 0

为什么可连接线程在 pthread_join 之前终止?

pthread_join 函数的文档说: 未能加入可加入的线程(即, 未分离),产生“僵尸线程”。 据我了解...

回答 1 投票 0

如何从C中的pthread线程返回值?

我是 C 新手,想稍微玩一下线程。我想使用 pthread_exit() 从线程返回一些值 我的代码如下: #包括 #包括 我是 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",但它输出一个随机数。如何打印返回值? 我返回指向局部变量的指针似乎是一个问题。返回/存储多线程变量的最佳实践是什么?全局哈希表? 这是正确的解决方案。在这种情况下,tdata是在主线程中分配的,并且有一个空间供线程放置其结果。 #include <pthread.h> #include <stdio.h> typedef struct thread_data { int a; int b; int result; } thread_data; void *myThread(void *arg) { thread_data *tdata=(thread_data *)arg; int a=tdata->a; int b=tdata->b; int result=a+b; tdata->result=result; pthread_exit(NULL); } int main() { pthread_t tid; thread_data tdata; tdata.a=10; tdata.b=32; pthread_create(&tid, NULL, myThread, (void *)&tdata); pthread_join(tid, NULL); printf("%d + %d = %d\n", tdata.a, tdata.b, tdata.result); return 0; } 您返回的是局部变量的地址,当线程函数退出时该变量不再存在。无论如何,为什么要打电话给pthread_exit?为什么不简单地从线程函数返回一个值? void *myThread() { return (void *) 42; } 然后在main中: printf("%d\n", (int)status); 如果您需要返回一个复杂的值(例如结构),最简单的方法可能是通过 malloc() 动态分配它并返回指针。当然,启动线程的代码将负责释放内存。 您已返回一个指向局部变量的指针。即使不涉及线程,这也很糟糕。 当启动的线程与加入的线程相同时,通常的方法是将一个指向 int 的指针传递给调用者管理的位置,作为 pthread_create 的第四个参数。然后,这将成为线程入口点的(唯一)参数。您可以(如果您愿意)使用线程退出值来指示成功: #include <pthread.h> #include <stdio.h> int something_worked(void) { /* thread operation might fail, so here's a silly example */ void *p = malloc(10); free(p); return p ? 1 : 0; } void *myThread(void *result) { if (something_worked()) { *((int*)result) = 42; pthread_exit(result); } else { pthread_exit(0); } } int main() { pthread_t tid; void *status = 0; int result; pthread_create(&tid, NULL, myThread, &result); pthread_join(tid, &status); if (status != 0) { printf("%d\n",result); } else { printf("thread failed\n"); } return 0; } 如果您绝对必须使用结构的线程退出值,那么您必须动态分配它(并确保加入线程的人释放它)。但这并不理想。 我认为你必须将数字存储在堆上。 int ret变量位于堆栈上,并在函数myThread执行结束时被销毁。 void *myThread() { int *ret = malloc(sizeof(int)); if (ret == NULL) { // ... } *ret = 42; pthread_exit(ret); } 不需要的时候不要忘记free它 另一种解决方案是将数字作为指针的值返回,就像 Neil Butterworth 所建议的那样。 #include<stdio.h> #include<pthread.h> void* myprint(void *x) { int k = *((int *)x); printf("\n Thread created.. value of k [%d]\n", k); //k =11; pthread_exit((void *)k); } int main() { pthread_t th1; int x =5; int *y; pthread_create(&th1, NULL, myprint, (void*)&x); pthread_join(th1, (void*)&y); printf("\n Exit value is [%d]\n", y); } 您正在返回对 ret 的引用,它是堆栈上的变量。 问题:返回/存储多线程变量的最佳实践是什么?全局哈希表? 这完全取决于您想要返回的内容以及您将如何使用它?如果您只想返回线程的状态(例如线程是否完成了其打算执行的操作),则只需使用 pthread_exit 或使用 return 语句从线程函数返回值。 但是,如果您想要更多信息用于进一步处理,那么您可以使用全局数据结构。但是,在这种情况下,您需要使用适当的同步原语来处理并发问题。或者,您可以分配一些动态内存(最好是用于要存储数据的结构)并通过 pthread_exit 发送它,一旦线程加入,您就可以在另一个全局结构中更新它。这样,只有一个主线程会更新全局结构,并发问题就解决了。但是,您需要确保释放不同线程分配的所有内存。 #include <pthread.h> #include <stdio.h> #include <stdint.h> void *myThread(void *args) { return (void *)(intptr_t)42; } int main(void) { pthread_t tid; void *status; int ret; pthread_create(&tid, NULL, myThread, NULL); ret = pthread_join(tid, &status); if (ret) { fprintf(stderr, "pthread_join() failed\n"); return -1; } /* pthread_join() copies the exit status (namely 42) of the target thread * into the location pointed to by retval (namely &status), &status points * to void *, so we need to cast void * to int. */ printf("%ld\n", (intptr_t)status); return 0; } 如果您对返回地址感到不舒服并且只有一个变量,例如。要返回一个整数值,您甚至可以在传递它之前将其类型转换为 (void *),然后当您在 main 中收集它时,再次将其类型转换为 (int)。您拥有价值,而不会发出丑陋的警告。 我这样做了: void *myThread() { int ret = 42; return (void*)(__intptr_t)ret; } int main() { pthread_t tid; int status = 1; pthread_create(&tid, NULL, myThread, NULL); pthread_join(tid, (void*)(__intptr_t)&status); printf("%d\n",status); return 0; }

回答 10 投票 0

为什么我们无法从分离的线程中获取线程终止代码?

我的问题很奇怪,但就是这样。我的问题:是否有任何解释为什么 posix 线程开发人员无法从分离的线程获取退出代码? 我明白了...

回答 1 投票 0

如何高效地使用Pthread来生成和处理多线程组合?

我有 2 个文件,其中 1 个包含所有 16 位数字,另一个包含 144 个自定义 8 位数字。 我的目标是生成像这样的组合[16位][16位][8位],总共40位,然后从

回答 1 投票 0

向 pthread 传递多个参数(包括向量参数)

我目前遇到了与使用 pthread.h 相关的问题(因为我对它还很陌生),所以我真的希望我能从这个论坛获得一些帮助..让我们假设我想传递这个函数。 ..

回答 1 投票 0

在循环中调用 `accept` 系统调用会创建损坏的套接字

我正在尝试用 C 语言为自己构建一个 Web 应用程序。到目前为止,我已经让 HTTP 服务器正常工作了,但是由于某种原因,当我有需要其他 CSS 的 HTML 文件和 JavaScript 文件时,浏览器(

回答 2 投票 0

musl中有没有像glibc中的“backtrace”这样的函数

我正在尝试将我的代码从centos翻译成Alpine-docker,但是Alpine确实缺少一些功能,例如“backtrace”“pthread_rwlockattr_setkind_np”等。我该如何使用

回答 1 投票 0

CMAKE Linux Mint 构建 gtest “/usr/bin/ld: 找不到 -lThreads::Threads: 没有这样的文件或目录”

CMAKE Linux Mint 构建 gtest “/usr/bin/ld: 找不到 -lThreads::Threads: 没有这样的文件或目录” 这是 apt-get install libgtest-dev 后开箱即用的 Gtest 工作完美...

回答 1 投票 0

使用 ROS 和 cmake 正确链接库

我正在尝试为带有ROS的MOXA I/O以太网模块添加一些代码。我正在使用一些示例代码,以确保它有效。我已经用 gcc 编译了代码,所以我知道代码可以工作。我编译了...

回答 2 投票 0

pthread 互斥锁:错误 LNK2019:无法解析的外部符号 c++

我收到此链接错误,但找不到解决方案。你能帮我找到正确的搜索方向吗? 我得到:错误 LNK2019:无法解析的外部符号 _imp_pthread_mutex...

回答 4 投票 0

在 Linux 上以 root 身份调用 SCHED_FIFO 线程的 pthread_create() 时获取 EPERM

我试图在 Linux 系统上以 SCHED_FIFO 或 SCHED_RR 策略作为 root 生成线程,但我对 pthread_create() 的调用返回 1 (EPERM)。 pthread_create() 的手册页说 EPERM

回答 5 投票 0

我可以在哪里找到 Linux 的 pthreads

好的。我的最后一个问题将因拼写错误而被否决。好的。但我的系统中确实没有pthreads。 我的系统: Linux vps-sohoportal.hspheredns.com 2.6.18-294.26.1.el5.lve0.8.18xen #1 SMP 星期四 ...

回答 2 投票 0

调用 NTPL 函数 __pthread_setname_np() 时二进制崩溃

我正在调用下面的函数来为我的线程分配名称 pthread_setname_np(tid, 名称); 但是,我的二进制文件崩溃并出现以下错误: 线程 9“ABC”收到信号 SIGSEGV,分段

回答 1 投票 0

(GNU+Linux) 多个线程同时调用malloc()

我在网上读到,大多数现代 UNIX 系统默认都带有线程安全的 malloc()。我知道这仅仅意味着一个线程可以安全地调用 malloc(),而另一个线程已经在中间......

回答 1 投票 0

有没有办法阻止后代线程自动进入其祖先线程的cgroup?

我将应用程序的一些线程显式地写入由我创建的 Linux cpu cgroup(例如,让我们现在讨论 v1,但如果您知道 v2 的方法,那就太好了)。 不过,我看到了这个描述...

回答 1 投票 0

pthread_create() 调用的函数有多个参数?

我需要将多个参数传递给我想在单独线程上调用的函数。我读过,执行此操作的典型方法是定义一个结构体,向函数传递一个指向该结构体的指针,...

回答 9 投票 0

pthread_mutex_t 这样的类型是如何在 C 中实现的?

如果可能的话,我想将其中一些属性引入我创建的类型中。 更具体地说,我想更多地了解这些: 如果我尝试手动...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.