pthreads 相关问题

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

本应没有值时却出现 NULL 值

我有一个程序,可以从文本文件中读取单词,并计算唯一单词的数量及其频率,可能使用多个线程: #include“向量.h” #定义 MIN_STRING_LEN...

回答 1 投票 0

使用有效字符串调用 strcmp 时出现段错误

我有一个函数可以在 C 中维护一个动态大小的数组。该程序读取一个文本文件并创建每个唯一单词的列表以及该单词的频率。它有一个搜索功能,看起来...

回答 1 投票 0

出于测试目的强制 `pthread_create` 失败

为了测试错误恢复,我想让 pthread_create 以可预测的方式失败。最明显的方法是对允许的线程数设置硬性上限

回答 2 投票 0

VSCode 不会构建和调试 pthreads 代码

我从 https://computing.llnl.gov/tutorials/pthreads/ 获得了一些代码,我尝试使用 VSCode 调试器来尝试单步调试它们,但它似乎不起作用。 使用任务 (ctrl+shift+B) ...

回答 2 投票 0

是否需要调用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

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