- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个项目,我从命令行接收输入,例如“54 342 12”,并且应该为每个输入创建一个线程,并让线程返回一个整数数组,然后主线程应该打印出不同的质因数分解。但是我收到了奇怪的输出,例如一堆零。我不知道为什么,我们将不胜感激任何帮助。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct _thread_data_t {
int tid;
} thread_data_t;
void *runner(void *param);
int main(int argc, char *argv[]) {
pthread_t thr[argc];
pthread_attr_t attr;
int i, rc;
//int *primeFactor;
//primeFactor = (int *)malloc(sizeof(int)*argc);
//thread_data_t thr_data[argc];
printf("Prime Numbers: ");
//Get the default attributes
pthread_attr_init(&attr);
//creat the thread
for(i = 1; i < argc; ++i){
//thr_data[i].tid = i;
if ((rc = pthread_create(&thr[i],&attr,runner,argv[i]))){
fprintf(stderr, "error: pthread_create, rc: %d\n", rc);
return EXIT_FAILURE;
}
}
//Wait for the thread to exit
for(i = 1; i < argc; ++i){
void *returnValue;
int r = 0;
int x = (sizeof(returnValue) / sizeof(returnValue[0])) - 1;
pthread_join(thr[i], &returnValue);
for(r = 0; r < x; r++){
//int c = (int *)returnValue[r];
printf("%d ", ((int *)returnValue)[r]);
}
}
printf("\nComplete\n");
}
//The Thread will begin control in this function
void *runner(void *param) {
int *primeFactors;
int num = atoi(param);
primeFactors = (int *)malloc(sizeof(int)*num);
int i, j, isPrime;
int k = 0;
for(i=2; i<=num; i++)
{
if(num%i==0)
{
isPrime=1;
for(j=2; j<=i/2; j++)
{
if(i%j==0)
{
isPrime = 0;
break;
}
}
if(isPrime==1)
{
primeFactors[k] = i;
k++;
}
}
}
//Exit the thread
// pthread_exit(0);
// pthread_exit((void *)primeFactors);
pthread_exit(primeFactors);
}
最佳答案
这一行有问题:
int x = (sizeof(returnValue) / sizeof(returnValue[0])) - 1;
sizeof array/sizeof array[0]
仅适用于纯数组,不适用于指针。请注意,returnValue
是一个指针,因此 sizeof(returnValue)
确实如此不返回线程创建的整数序列的大小(以字节为单位),它给出指针需要在内存中存储的字节数。在x86_64 架构很可能是 8,所以在大多数情况下 x
是大于质因数的实际数量,您将访问指针超出范围,这就是您看到垃圾值的原因。
因为您要返回一个指向malloc
ed位置的指针,所以您需要返回长度也是如此。最好的方法是创建一个结构返回值并将信息存储在那里。
创建一个结构体
struct thread_result
{
int *factors;
size_t len;
};
并返回指向该结构的指针,其中包含以下信息:
void *runner(void *param) {
int *primeFactors;
int num = atoi(param);
if(num == 0)
pthread_exit(NULL);
struct thread_result *res = calloc(1, sizeof *res);
res->factors = NULL;
res->len = 0;
int *tmp;
if(res == NULL)
pthread_exit(NULL);
int i, j, isPrime;
int k = 0;
for(i=2; i<=num; i++)
{
if(num%i==0)
{
isPrime=1;
for(j=2; j<=i/2; j++)
{
if(i%j==0)
{
isPrime = 0;
break;
}
}
if(isPrime==1)
{
tmp = realloc(res->factors, (k+1) * sizeof *res->factors);
if(tmp == NULL)
{
free(res->factors);
free(res);
pthread_exit(NULL);
}
res->factors = tmp;
res->factors[k++] = i;
res->len = k;
}
}
}
pthread_exit(res);
}
现在你可以获得这样的值:
for(i = 1; i < argc; ++i){
void *data;
pthread_join(thr[i], &data);
if(data == NULL)
continue; // error in thread
struct thread_result *res = data;
for(size_t r = 0; r < res->len; r++){
printf("%d ", res->factors[r]);
}
free(res->factors);
free(res);
}
并且不要忘记销毁线程属性
pthread_attr_destroy(&attr);
在离开main
之前。但是您没有为线程设置任何属性,所以您可以使用以下命令创建线程:
pthread_create(&thr[i], NULL, runner, argv[i]);
还有don't cast malloc
你必须检查返回值malloc
。
编辑
OP在评论中写道
I think I updated all of my code correctly to match what you said but now I am recieving the error "Segmentation dump (core dumped)" Any idea on why this might be?
其实没有,但你一定是错过了什么地方,因为当我编译并运行此代码:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct _thread_data_t {
int tid;
} thread_data_t;
void *runner(void *param);
struct thread_result
{
int *factors;
size_t len;
};
int main(int argc, char *argv[]) {
pthread_t thr[argc];
int i, rc;
printf("Prime Numbers:\n");
for(i = 1; i < argc; ++i){
if ((rc = pthread_create(&thr[i],NULL,runner,argv[i]))){
fprintf(stderr, "error: pthread_create, rc: %d\n", rc);
return EXIT_FAILURE;
}
}
for(i = 1; i < argc; ++i){
void *data;
pthread_join(thr[i], &data);
if(data == NULL)
continue; // error in thread
struct thread_result *res = data;
for(size_t r = 0; r < res->len; r++){
printf("%d ", res->factors[r]);
}
free(res->factors);
free(res);
puts("");
}
}
void *runner(void *param) {
int num = atoi(param);
if(num == 0)
pthread_exit(NULL);
struct thread_result *res = calloc(1, sizeof *res);
res->factors = NULL;
res->len = 0;
int *tmp;
if(res == NULL)
pthread_exit(NULL);
int i, j, isPrime;
int k = 0;
for(i=2; i<=num; i++)
{
if(num%i==0)
{
isPrime=1;
for(j=2; j<=i/2; j++)
{
if(i%j==0)
{
isPrime = 0;
break;
}
}
if(isPrime==1)
{
tmp = realloc(res->factors, (k+1) * sizeof *res->factors);
if(tmp == NULL)
{
free(res->factors);
free(res);
pthread_exit(NULL);
}
res->factors = tmp;
res->factors[k++] = i;
res->len = k;
}
}
}
pthread_exit(res);
}
我得到这个输出:
$ valgrind ./a 54 342 12
==17697== Memcheck, a memory error detector
==17697== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==17697== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==17697== Command: ./a 54 342 12
==17697==
Prime Numbers:
2 3
2 3 19
2 3
==17697==
==17697== HEAP SUMMARY:
==17697== in use at exit: 0 bytes in 0 blocks
==17697== total heap usage: 19 allocs, 19 frees, 3,640 bytes allocated
==17697==
==17697== All heap blocks were freed -- no leaks are possible
==17697==
==17697== For counts of detected and suppressed errors, rerun with: -v
==17697== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
这告诉我一切工作正常并且所有内存都已被释放好吧。
所以当你复制并粘贴我的代码时,你一定犯了一个错误回答。
关于c - Pthread Posix 质因数分解得到奇怪的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49103447/
是否有详细说明从一个 POSIX 版本更改为另一个版本的文档?我正在寻找一些东西,在表格 View 中,详细说明从 2004 年到 2008 年的变化 最佳答案 有点。这是Rationale ,每卷一
根据POSIX FAQ ,该标准已于 2013 年由 IEEE 修订和批准。 与 2008 年的先前标准相比有何变化? 最佳答案 根据 online edition 中的摘要, POSIX.1-2
我正在开发一个简单的并行应用程序,我想在其中使用单个进程来维护有关一系列工作进程的状态信息。设置一个 POSIX 消息队列似乎相对容易,其中所有工蜂都可以向状态维护者发送定期更新。我的问题? POSI
计划使用 posix 信号量来同步 2 个进程。不太确定使用哪个 - 命名或未命名。 各自的优缺点是什么?我如何决定使用哪个?在哪些情况下,一种优于另一种? 谢谢。 最佳答案 如果这两个进程不相关,则
嵌套参数替换在 Zsh 中有效: $ param=abc # nested remove prefix ${...#a} and remove suffix ${...%c} => $ printf
更新:整个问题出在一条错误线上,这是我的 C++ 代码中的语法错误。 在 Linux 上我发现 #define _NSIG 64 在 asm-generic/signal.h ,
我在网上遇到了两个 POSIX 文档。 http://pubs.opengroup.org/onlinepubs/009695399/ (IEEE 标准 1003.1,2004 年版) Abstrac
我正在开发一个简单的软件来检查我是否能够使用我研究过的 POSIX 定时器和信号进行编程。 我正在尝试做一个简单的程序来启动计时器并在一定的纳秒内发出信号 下面的程序运行得不好,所以我写了一些关于我的
如果我有一个通过 shell 运行的应用程序,是否有 POSIX 文档说 --help需要支持吗?我会这么认为,因为这似乎是最流行的终端应用程序(GNU 工具等)中的标准做法。 我很好奇我是否可以使用
自适应 AUTOSAR 基于什么 POSIX PSE51? 在学习自适应 AUTOSAR 时,我发现“自适应 AUTOSAR 基于 POSIX PSE51”。 但是,我不明白什么是 POSIX PSE
GNU bash manual说到shell参数有以下一段话: The command builtin does not prevent builtins that take assignment s
我应该在我的嵌入式 Linux 环境中使用 System V 消息队列还是 Posix 消息队列?项目中常用什么? 最佳答案 两者都有相同的基本工具——信号量、共享内存和消息队列。它们为这些工具提供了
用 tsearch 填充了 POSIX 二叉树后,如何清理整棵树? GCC 提供了 tdestroy 作为扩展,但是如果你想使用 POSIX-only 函数,你该怎么做呢? 我当前的实现使用 twal
来自 C++ 应用程序。为 AIX、HP-UX、Linux、OSX 和 Solaris 编译是否有一种简单的方法来确定应用程序是否可用。在系统启动后 5 分钟内运行? 在 Windows 上我可以这样
System V IPC 和 POSIX IPC 之间有什么区别? 为什么我们有两个标准? 如何决定使用哪些 IPC 函数? 最佳答案 两者都有相同的基本工具——信号量、共享内存和消息队列。它们提供的
根据this ,POSIX 库不包含 getopt.h。但是,我在 unistd.h 中找到了这个: #ifdef __USE_POSIX2 /* Get definitions and proto
我正在尝试使用 POSIX 共享内存和 POSIX 信号量构建客户端服务器应用程序。我是否必须将信号量放在共享内存段内,或者信号量是否可以只是全局变量?我希望遵守 POSIX 约定。 最佳答案 不,信
尝试读取 Rust fn 中任意用户的主目录,并使用 posix::pwd crate。 不幸的是,我找不到任何使用 FFI 的好例子,并且一直在处理关于指针和类型可变性的各种类型错误。 我的(非编译
我阅读了一个信号的手册页使用 man 7 signal我看到两种类型的信号。所以,我有一个问题, Linux 中的POSIX 可靠信号 和POSIX 实时信号 有什么区别? 最佳答案 如今,将这些表述
据我所知,ucontext 提供了比 setjmp 更好的东西。但它已被弃用,现在已从 POSIX 规范中删除。那么它为什么会出现,又为什么会被移除? 最佳答案 makecontext的签名来自 uc
我是一名优秀的程序员,十分优秀!