- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用辛普森规则进行数值积分,所以我认为最好的方法是在三个线程中,一个用于 2,一个用于 3,然后是结束边界。
但我是线程新手,仍在学习一些东西。但是,我真的不知道这有什么问题,我使用其属性创建线程并将其发送出去,然后释放属性并尝试在线程可用时加入它们,我做错了吗?有更好的方法吗?
感谢您的帮助!
附加代码::
#include <stdio.h>
#include <math.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/wait.h>
#define PI 3.1415926535897932384626433832795028841971693993751058
float h_val, x_i, a_bound, b_bound, n_slices;
long double temp_vals[4];
int first, second = 0;
void * threes (void *t)
{
long double a_n;
long double seq_threes;
long double x_i;
long tid = (long)t;
long double threes_sum = 0;
for(int i = 1; i < n_slices; i++)
{
a_n = .25*((6*i)-(pow((-1),i))-3);
x_i = a_n * (PI / n_slices);
printf("Value of i :: %d Value of x_i :: %Lf \n", i, x_i);
seq_threes = 3*pow(((sin(PI*sin(x_i)))/(PI*sin(x_i))),2);
threes_sum = threes_sum + seq_threes;
}
temp_vals[0] = threes_sum;
pthread_exit((void*) t);
return EXIT_SUCCESS;
}
void * twos (void *t)
{
long double a_n;
long double seq_twos;
long double x_i;
long double twos_sum = 0;
long tid = (long)t;
for(int i = 1; i < n_slices; i++)
{
a_n = 3*i;
x_i = a_n * (PI / n_slices);
printf("Value of i :: %d Value of x_i :: %Lf \n", i, x_i);
seq_twos = 2*pow(((sin(PI*sin(x_i)))/(PI*sin(x_i))),2);
twos_sum = twos_sum + seq_twos;
}
temp_vals[1] = twos_sum;
pthread_exit((void*) t);
return EXIT_SUCCESS;
}
void* ends(void *t)
{
long double a_n, a_0;
long double x_n = n_slices;
long double x_0 = 0;
long tid = (long)t;
pid_t end_to_end;
printf("End to ends:: x_n ==%Lf \n",x_n);
end_to_end = fork();
if (end_to_end == 0)
{
x_0 = 0 * (PI / n_slices);
a_0 = 1;
printf("a_0 :: %Lf :: x_0 :: %Lf\n",a_0, x_0);
exit(1);
}
else
{
x_n = n_slices * (PI / n_slices);
a_n = pow(((sin(PI*sin(x_n)))/(PI*sin(x_n))),2);
printf("a_n :: %Lf || x_n :: %Lf\n",a_n, x_n);
wait(NULL);
}
temp_vals[2] = a_0 + a_n;
pthread_exit((void*) t);
return EXIT_SUCCESS;
}
int main(int argc, char *argv[])
{
pid_t id;
pthread_t ends_thread, twos_and_threes[3];
pthread_mutex_t thread_locker;
void * status;
long t;
n_slices =(atof(argv[1])) ;
n_slices = ((n_slices + 3 - 1) / 3) * 3 ;
printf("Running with slice size :: %lf (must be multiple of 3)\n", n_slices);
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_mutex_init(&thread_locker, NULL);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
//Child Process
if(pthread_create(&twos_and_threes[0], &attr,ends,(void*) t))
return EXIT_FAILURE;
if(pthread_create(&twos_and_threes[1],&attr,twos,(void*)t))
return EXIT_FAILURE;
if(pthread_create(&twos_and_threes[2],&attr,threes,(void*)t))
return EXIT_FAILURE;
wait(NULL);
pthread_attr_destroy(&attr);
for(int i = 0 ; i < 3 ; i++)
pthread_join(twos_and_threes[i], &status);
/*
twos();
threes();
ends();
*/
temp_vals[3] = temp_vals[0]+temp_vals[1] +temp_vals[2];
printf( "Temp vals :: %Lf :: %Lf :: %Lf :: %Lf\n",\
temp_vals[0],temp_vals[1],temp_vals[2],temp_vals[3]);
wait(NULL);
long double result =((3*(PI/ n_slices))/8)*(temp_vals[3]) ;
printf("Result == %Lf \n",result);
pthread_exit(NULL);
return EXIT_SUCCESS;
}
谢谢您,这解决了该错误,并进行了一些其他更改,代码已更新以反射(reflect)。
最佳答案
您在一个进程中创建线程,然后在另一进程中销毁它们。当您fork()
时,只有调用fork()
的线程才会出现在子级中,并且在子级中创建的线程不会神奇地出现在父级中。
这里不需要 fork()
以及线程。只需等待主线程中的线程完成即可。
关于c - 尝试使用 pthreads,出现 munmap 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28287653/
我有通过 mmap 创建的未命名进程间共享内存区域.进程是通过 clone 创建的系统调用。进程共享文件描述符表(CLONE_FILES)、文件系统信息(CLONE_FS)。进程不共享内存空间(除了先
当我尝试研究一些处理 FPGA 的代码时,我遇到了 munmap、mmap。 我仔细阅读了提供的手册 here .我仍然不明白这个功能的目的。这到底是做什么的? 最佳答案 mmap() 是一个系统调用
在 Mac 上,我使用 munmap 可以看到更高的页面回收率。 我的munmap的返回值为0,这表明请求的页面已成功取消映射。 当我使用以这种方式映射和取消映射的内存测试程序时,为什么会看到更高的页
我正在编写一个使用共享内存的函数库。我编写的用于关闭共享内存的函数每当到达 munmap() 部分时都会给我一个段错误,但如果我不使用该函数而只是让代码 munmap() 和 shm_unlink 最
我定义了一个名为 ClusterSet 的类,它只有一个字段,名为 clusters: class ClusterSet { std::map* > clusters; public:
我正在编写一个程序,并获得了一个内存位置,我将其存储为一个 unsigned int,并将映射的长度存储为一个 unsigned int,我想取消映射。 我的以下方法会生成警告: warning: p
我调用munmap没有错误,但映射仍然可见 /proc//maps当我尝试 mmap(address_overlapping_with_what_I_tried_to_munmap, ...)我没有得
如果一个进程调用 mmap(...,MAP_ANONYMOUS | MAP_SHARED,...) 并 fork N 个子进程,这些进程(父进程或后代进程)中的任何一个是否有可能 munmap() 一
例如,如果我这样做: char *pMap1; /* First mapping */ char *pReq; /* Address we would l
我想知道,为什么映射内存的大小应该作为一个参数传入,因为从同一地址开始的映射不能超过一个(可以吗?),为什么 linux 内核不记录两个起始地址, 长度在一起,但让用户空间程序记住它们。 我的意思是,
我试图优化 C 代码。当我使用 strace跟踪程序,我发现它一直在调用 mmap和 munmap .但是这段代码只是对使用 malloc() 分配的内存元素进行操作。 .有人可以解释为什么吗? 最佳
我想知道是否有必要(或建议)在通过 fork 创建的子进程中取消映射共享内存(使用 munmap),如果内存已获得在父级中,在 fork 之前,使用 mmap(..., MAP_ANONYMOUS |
我在 RHEL 5.8 上有一个多线程应用程序,它通过 mmap 读取大文件(每个文件大约 500MB)并对它们进行一些处理;一个线程执行 mmap,其他线程执行处理。当文件不再位于文件系统上时,将执
Open Group 标准规定应使用页对齐地址调用 munmap,但似乎没有任何要求 mmap 应返回页对齐地址。这是您在编写可移植代码时需要处理的事情吗? 最佳答案 mmap 只会映射整个页面,因此
我正在尝试使用辛普森规则进行数值积分,所以我认为最好的方法是在三个线程中,一个用于 2,一个用于 3,然后是结束边界。 但我是线程新手,仍在学习一些东西。但是,我真的不知道这有什么问题,我使用其属性创
有关于通过mmap分配内存的代码 void *ret = mmap(NULL, 4 * 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1
如果我在内存映射区域上使用 MS_ASYNC 调用 msync,同步过程将被异步处理。 但是,如果我立即对该区域调用 munmap,我是否可以假设 msync 将安全执行?或者我必须在 munmap
我对 C++ 比较陌生,正在学习其他人的代码。他的代码从映射文件中读取,但最终没有释放任何映射内存。以我的理解, mmap() 将文件映射到虚拟内存中。难道我不需要以某种方式释放那些映射内存,比如调用
我有一个关于 Linux 中的 mmap 和 munmap 的简单问题:是否有可能 mmap 成功但 munmap 失败? 假设所有参数都正确给出,例如,请看下面的代码片段。什么情况下会打印munma
我正在尝试为无交换系统实现一个文件支持的内存分配器。 对于每个新分配,我使用 mkstemp 创建一个临时文件作为后台存储,mmap 将其作为 MAP_SHARED 以允许交换页面当系统的内存压力很高
我是一名优秀的程序员,十分优秀!