pthreads 相关问题

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

使用 pthread_getname_np() 检查线程当前是否正在运行是否安全?

我之前在一家公司的代码库(使用 C 为基于 linux 的系统开发嵌入式软件)中看到使用 pthread_getname_np() 检查线程当前是否正在运行。我有...

回答 0 投票 0

在带有 mingw 编译器的 Windows 中使用 pthreads

我在尝试编译包含 pthreads 的代码时遇到了错误。 我尝试从以下位置下载 pthreads 库: ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip 和

回答 0 投票 0

在循环中创建+加入多个 pthread (C)

我正在使用循环创建线程,其中用户通过参数指定线程数。一般代码如下: void* thread_fn(void* arg) { int num = *(int*)arg; p...

回答 0 投票 0

pthread_mutex_lock 实现:如何改变参数?

我有 pthread_mutex_t lock1 pthread_mutex_t id 定义为 (void*) 所以我认为 pthread_mutex_init(&lock1, NULL);做一个malloc 和 int k = pthread_mutex_lock(&lock1);以某种方式改变...

回答 0 投票 0

访问串口时发送/接收线程似乎被阻塞

我用C写了一个UART读写程序,这里是demo测试代码, typedef 结构 devpara { 诠释; 整数 } devpara_t; int g_step = 1; // 初始化步骤 主函数() { int ret = 0; 开发...

回答 1 投票 0

我是 pthreads 的新手并将它们与互斥锁一起使用。谁能指出我如何使用它们的正确方向?

我有一个使用 pthreads 和 mutex 的编程作业。该程序的重点是接收输入(.txt 文件),输入如下所示: 桥接数字1 数字2 CarOrBoat CoB_name ...

回答 0 投票 0

qnx如何调度线程

应用程序正在使用 pthread lib,如果进程 A 有 100 个线程准备就绪,在进程 B 有一个线程准备好运行之后,调度程序 1) 将从进程 A 最大选择和执行线程...

回答 0 投票 0

为什么 pthread_mutex_trylock 不是异步信号安全函数?

我从阅读这个 github 问题中了解到,“旧的 LinuxThreads 库和新的 NPTL 库都以异步信号安全的方式实现 trylock()”,但是“MacOSX ...

回答 1 投票 0

在 linux wsl 上使用代码运行器扩展在 vscode 上启用 pthread?

在 VS Code 上使用 Posix 线程和 Code runner 时,我在 Linux 上遇到错误 - 未定义引用 pthread_create() 的错误;

回答 1 投票 0

使用 pthread 的并发哈希映射的 C++ 实现

get方法中对pthread_mutex_lock的调用永远阻塞(在使用map的场景下,构造函数和然后对put的几次调用正确执行)。可能是什么原因...

回答 0 投票 0

pthread_cond_wait()如何与mutex解耦?

我一直在思考条件变量背后的逻辑,并且对与之相关的最常见问题感到满意。 基本上,如果我们做类似的事情: mutex.lock() whi...

回答 1 投票 0

C - 多处理线程实现 - 指针问题

我只需要编写一个代码来计算一个数组的一半的局部最大值..但是有一些问题(?) 我看到分段错误问题 #包括 #包括 我只需要写一个代码来计算一个数组的一半的局部最大值..但是有一些问题与 ponters (?) 我看到segmentation fault问题 #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <time.h> #include <stdlib.h> #define n 10 struct args { int index; int a[n]; }; void * max_locale(void * parameters) { struct args * pp = parameters; int max = pp->a[0]; int finalIndex = pp->index + n/2; for(int i=pp->index; i<finalIndex; i++) { if((pp->a[i]) > (pp->a[i+1])) { max = (pp->a[i]); } } return (void *)&max; } int main() { srand(time(NULL)); int array[n]; pthread_t thread1, thread2; struct args thread1_args, thread2_args; printf("-beginning of program-\n"); for(int i=0; i<n; i++) { array[i] = rand() % 101; printf("%d ", array[i]); } for(int i=0; i<n; i++) { thread1_args.a[i] = array[i]; thread2_args.a[i] = array[i]; } int * thread1_returnValue; int * thread2_returnValue; thread2_args.index = 0; thread2_args.index = n/2; printf("\n Find MAX... \n"); pthread_create(&thread1, NULL, &max_locale, &thread1_args); pthread_create(&thread2, NULL, &max_locale, &thread2_args); pthread_join(thread1, (void **) & thread1_returnValue); pthread_join(thread2, (void **) & thread2_returnValue); printf("Max 1:%d Max 2:%d \n", *thread1_returnValue, *thread2_returnValue); return 0; } 这是输出: -beginning of program- 98 28 73 5 10 100 23 63 25 60 Find MAX... zsh: segmentation fault ./15-4-23 我试图用 void * 函数返回 int, 如果我可以在pthred_create函数中传递不同的参数,那就容易多了

回答 0 投票 0

VS code 可以在 VirtualBox VM 中编译和运行 C 程序吗?

问题: 我必须制作使用 pthreads 的程序。为此,我在 VirtualBox 上有一个 Ubuntu VM,所以有人会说我已经准备好了。但我想知道我是否可以在仍然使用 POSIX 库的同时...

回答 1 投票 0

C:用数字 0 到 n -1 索引 pthreads

这是行不通的。它导致编号不是 0 索引的。 #define MY_THREAD_COUNT 6 void *runner(void *param) { int id = *(int*)param; printf("线程 %d “, ID); } ...

回答 0 投票 0

为什么每次我使用“cont”命令时,在 gdb 中运行时一个 CTRL-Z 会一直发出 SIGTSTP 信号?

我正在 Ubuntu Linux 上开发一个项目,当我使用 GDB 调试应用程序并按 CTRL + Z 中断时,我得到了预期的 SIGTSTP 和 GDB 中断。 但是当我在那之后使用 cont 时,我仍然......

回答 3 投票 0

在 c 中将多个线程加入一个线程

乙 基本上主线程创建 4 个线程 1 ,2 ,3 ,4 和 1、2、3 必须等待 4 结束,而 main 等待线程 1 2 3。 代码如下: #include #include 乙 基本上主线程创建了 4 个线程 1 ,2 ,3 ,4 和 1、2、3 必须等待 4 结束,而 main 等待线程 1 2 3。 代码如下: #include<stdio.h> #include<pthread.h> #include<stdlib.h> #include<unistd.h> pthread_t id[4]; void *func1(void *arg) { printf("i am the %ith thread\n",(int)arg); pthread_join(id[3],NULL); printf("end of %ith thread\n",(int)arg); pthread_exit(NULL); } void *func2(void *arg) { printf("i am the 4th thread\n"); sleep(5); printf("end of 4th thread\n"); pthread_exit(NULL); } int main() { printf("start of main thread\n"); pthread_create(&id[3],NULL,func2,NULL); for(int i=0;i<3;i++) { pthread_create(&id[i],NULL,func1,(void *)i); } for(int i=0;i<3;i++) { pthread_join(id[i],NULL); } printf("end of main\n"); return 0; } 跑步时我得到这样的东西:` 主线程开始 我是第0个线程 我是第 4 个线程 我是第二个线程 我是第一个线程 4线程结束 第0个线程结束 请原谅这些可怕的信息,因为我匆忙将它们从法语翻译过来。 理论上线程 1 2 3 应该等待 4 然后自己完成,但每次尝试只有一个线程在 4 之后完成,然后整个执行被无限期地阻塞。 我尝试确保第 4 个线程总是首先从 pthread_attr_t 开始,并设置第 4 个高的调度优先级,但不幸的是,这没有用。 我尝试查找有关 pthread_join 的一些详细信息,如果将多个线程加入一个线程是不安全的或不允许的,但我没有找到任何建议。 任何帮助将不胜感激提前谢谢你。 来自pthread_join()手册页: 如果多个线程同时尝试加入同一个线程,结果是不确定的。 如果需要在多个线程中等待线程终止,创建相应的标志包装到条件变量。在退出之前终止线程或在另一个线程中加入线程后广播条件变量。 补充说明: 始终检查系统函数的返回值。 pthread_exit(NULL) 在线程函数的末尾是多余的。只需返回 NULL。 从 int 到 void* 的转换可能会溢出,编译器不喜欢这样。我们可以使用 intptr_t 代替 int 但是在 intptr_t 中没有 printf() 的转换说明符,因此我们无论如何都应该转换。我们可以使用 intptr_t 的中间转换来让编译器开心。 程序可能是这样的: #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <unistd.h> #include <string.h> static pthread_t id[4]; static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; static int terminated = 0; static void *func1(void *arg) { printf("i am the %ith thread\n",(int)(intptr_t)arg); // Wait until 4th thread termination flag is set pthread_mutex_lock(&mtx); while (!terminated) { pthread_cond_wait(&cond, &mtx); } pthread_mutex_unlock(&mtx); printf("end of %ith thread\n",(int)(intptr_t)arg); return NULL; } static void *func2(void *) { printf("i am the 4th thread\n"); sleep(5); printf("end of 4th thread\n"); // Set termination flag and broadcast state change pthread_mutex_lock(&mtx); terminated = 1; pthread_mutex_unlock(&mtx); pthread_cond_broadcast(&cond); return NULL; } int main() { printf("start of main thread\n"); int ret; ret = pthread_create(&id[3],NULL,func2,NULL); if (ret) { fprintf(stderr, "pthread_create(id[3]): %s\n", strerror(ret)); return 1; } for(int i=0;i<3;i++) { ret = pthread_create(&id[i],NULL,func1,(void *)(intptr_t)i); if (ret) { fprintf(stderr, "pthread_create(id[%i]): %s\n", i, strerror(ret)); return 1; } } // Wait for all 4 threads for(int i=0;i<4;i++) { int ret = pthread_join(id[i],NULL); if (ret != 0) { fprintf(stderr, "pthread_join(id[%i]): %s\n", i, strerror(ret)); } } printf("end of main\n"); return 0; } UPD:有更简单的方法:将 pthread_join() 调用包装到由互斥锁保护的临界区: static pthread_t id[4]; static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; static int terminated = 0; static void *func1(void *arg) { printf("i am the %ith thread\n",(int)(intptr_t)arg); // Wait until 4th thread termination flag is set pthread_mutex_lock(&mtx); if (!terminated) { int ret = pthread_join(id[3],NULL); if (ret != 0) { fprintf(stderr, "pthread_join(id[3]): %s\n", strerror(ret)); } terminated = 1; } pthread_mutex_unlock(&mtx); printf("end of %ith thread\n",(int)(intptr_t)arg); return NULL; } static void *func2(void *) { printf("i am the 4th thread\n"); sleep(5); printf("end of 4th thread\n"); return NULL; } 在这种情况下,您不需要在main()中加入第4个线程: for(int i=0;i<3;i++) { int ret = pthread_join(id[i],NULL); ...

回答 1 投票 0

为什么MinGW-w64浮点精度依赖于winpthreads版本?

我使用 MinGW-w64 g++ 编译器 10.2 和 10.3。我自己使用 https://github.com/niXman/mingw-builds 构建了两者。 Windows 上的 g++ 有一个奇怪的地方:应用程序的主线程将...

回答 3 投票 0

无法将“long int”转换为“void(*)()”__depend in std_threads.h [关闭]

我正在尝试使用命令 cmake 编译 C++ 代码库。和做。但是,不断出现以下错误: 在此处输入图像描述 我对c++的库不太熟悉...

回答 0 投票 0

为什么 c++ 线程是可移动的而不是可复制的?

正如题名所说,为什么C++线程(std::thread和pthread)是可移动的而不是可复制的?如果我们让它可复制,会有什么后果?

回答 2 投票 0

在退出线程之前在本地指针上调用 free() 会导致无效读取

我正在从事一个编程项目,以更好地理解线程之间的同步。我正在逐行解析文本文件(使用多个线程)以读取网站名称(stackoverflo ...

回答 0 投票 0

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