- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一生都无法弄清楚为什么这是段错误。
这是段错误
get_ranks_parallel
上线
for (struct node* node = data->plist->head; node!=NULL; node=node->next)
代码如下:
typedef struct args args;
struct args
{
list* qlist;
double damps;
double dampening;
int j;
int n_cores;
int n_pages;
double *rank_current;
double *rank_previous;
};
//int cond;
int i;
void pagerank(list* plist, int ncores, int npages, int nedges, double dampener)
{
int num_pages = npages;
args* data = malloc(sizeof(data));
//data = malloc(sizeof(args) + num_pages * sizeof(double));
data->damps = (1-dampener)/npages; //eg (1-0.85/4)
double damp = (1-dampener)/npages;
data->qlist = plist;
//store pageranks into arrays of doubles
double rank_prev[npages]; //previous ranks
double rank_curr[npages]; //current ranks
for (i = 0; i < npages; i++)
{
rank_prev[i] = (double)1/npages; //must cast either 1 or npages as a double to get output as a double
rank_curr[i] = (double)1/npages;
}
data->dampening = dampener; //for use inside parallel function
int stop = 1;
data->n_cores = ncores; //for use inside parallel function
int num_cores = data->n_cores;
pthread_t thread_id[num_cores];
while(stop == 1)
{
//if more than one core, parallelise
//else solve sequentially
if (ncores > 1)
{
pthread_mutex_init(&mutex_lock, NULL);
for (data->j = 0; data->j < num_cores; data->j++)
{
//thread_args[k] = k; //(plist, damp, dampener, rank_prev, rank_curr, i, num_cores)
pthread_create(&thread_id[data->j], NULL, &get_ranks_parallel, NULL);
}
for (data->j = 0; data->j < num_cores; data->j++)
{
pthread_join(thread_id[data->j], NULL);
}
for (i = 0; i < npages; i++)
{
rank_prev[i] = data->rank_previous[i];
rank_curr[i] = data->rank_current[i] ;
}
pthread_mutex_destroy(&mutex_lock);
}
else
{
get_ranks_seq(plist, damp, dampener, rank_prev, rank_curr);
}
stop = check_converge(rank_curr, rank_prev, npages);
update_prev(rank_curr, rank_prev, npages);
}
print_ranks(rank_curr, plist);
}
void * get_ranks_parallel(void * q)
{
args * data = (struct args *) q;
data = malloc(sizeof(struct args));
//store pageranks into arrays of doubles
data->rank_previous[data->n_pages]; //previous ranks
data->rank_current[data->n_pages]; //current ranks
//initialise_rank(rank_prev, rank_curr, npages); //initialise both rank arrays, setting all values a 1/N
for (i = 0; i < data->n_pages; i++)
{
data->rank_previous[i] = (double)1/data->n_pages; //must cast either 1 or npages as a double to get output as a double
data->rank_current[i] = (double)1/data->n_pages;
}
//loops through all the pages
for (struct node* node = data->qlist->head; node!=NULL; node=node->next)
{
//calling page from current node in list
page* p = node->page;
//thread will operate on rooms with index the same as thread id initially, then thread id +ncores, so all threads work on the same amount of rooms
if ((node->page->index) == data->j)
{
//check to make sure inlinks list is not empty
double sum = 0.0;
if (p->inlinks!=NULL)
{
//loops through the inlinks list that is associated with current page
for (struct node* inNode = p->inlinks->head; inNode != NULL; inNode = inNode->next)
{
pthread_mutex_lock(&mutex_lock);
sum += data->rank_previous[inNode->page->index] / inNode->page->noutlinks; //calculations on current page using inlinks list associated with it
pthread_mutex_unlock(&mutex_lock);
}
}
pthread_mutex_lock(&mutex_lock);
data->rank_current[node->page->index] = data->damps + data->dampening*sum;
pthread_mutex_unlock(&mutex_lock);
}
pthread_mutex_lock(&mutex_lock);
data->j += data->n_cores;
pthread_mutex_unlock(&mutex_lock);
}
//free(args);
}
plist 和 inlinks 都是在头文件中设置的链接列表,所以我所做的就是获取这些参数和所有参数,并使用它们来计算所有页面的“pageranks”并将它们存储到一个数组中。plist 存储页面结构体(p),每个结构体又存储一个链表(inlist)
我必须让它尽可能快地运行,因此线程
它创建线程,然后在尝试循环遍历链表 plist 时给出段错误。显然我的指针指向的地方有问题,但我一生都无法弄清楚。线程化这个程序是一场噩梦。
如果有帮助,这是正常编写的函数,不将所有参数都视为 void *基本上,当程序运行顺序函数时,它运行良好,但当尝试在并行函数中循环 plist 时,会出现 seg 错误。
void get_ranks_seq(list* plist, double damp, double dampener, double rank_prev[], double rank_curr[])
{
//loops through all the pages
for (struct node* node = plist->head; node!=NULL; node=node->next)
{
//calling page from current node in list
page* p = node->page;
//check to make sure inlinks list is not empty
double sum = 0.0;
if (p->inlinks!=NULL)
{
//loops through the inlinks list that is associated with current page
for (struct node* inNode = p->inlinks->head; inNode != NULL; inNode = inNode->next)
{
sum += rank_prev[inNode->page->index] / inNode->page->noutlinks; //calculations on current page using inlinks list associated with it
}
}
rank_curr[node->page->index] = damp + dampener*sum;
}
}
抱歉,如果这没有多大意义,任何帮助将不胜感激!
<小时/>更新:
我从 valgrind 收到此错误:
==5337== Thread 2:
==5337== Invalid read of size 4
==5337== at 0x4017A8: get_ranks_parallel (in /.automount/net/ufiler5/u3/cs1/lsin8526/comp2129_2013/assignment4/assignment4/pagerank)
==5337== by 0x3252607D14: start_thread (in /usr/lib64/libpthread-2.16.so)
==5337== by 0x3251EF246C: clone (in /usr/lib64/libc-2.16.so)
==5337== Address 0x20 is not stack'd, malloc'd or (recently) free'd –
最佳答案
你愿意
args * data = (struct args *) q;
然后紧接着,
data = malloc(sizeof(struct args));
使data
指向未初始化的内存,因此data->qlist
在循环开始时为NULL
。不确定您想要做什么,但这就是您的问题。
关于c - pthread_create 之后的段错误 (,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16706780/
我正在努力实现以下目标: 强制新创建的线程在 pthread_create() 之后立即开始运行。没有使用实时调度。 来自pthread_create() man page : Unless real
我想做这样的事情: void *do_work_son(void *data) { mystruct *d = (mystruct*)data; while(tr
typedef struct client { pthread thread; Window_t *win }client; client * client_create(int ID)
我编译最新的 buildroot,并使用输出主机 mipsel-linux-gcc 来编译我的 c 程序。我已经测试了 hello world 程序,它在 MIPS 机器上运行良好(实际上是一个用 p
每当我在我的程序上运行 valgrind 时,它都会告诉我在调用 pthread_create 的任何地方都可能丢失了内存。我一直在尝试遵循 上的指导 valgrind memory leak err
是否有(在 glibc-2.5 和更新版本中)为 pthread_create 定义 Hook 的方法? 有很多二进制应用程序,我想编写一个动态库以通过 LD_PRELOAD 加载 我可以在 main
我正在开发一个多线程程序,但是由于某种原因,我无法创建线程。当我尝试调试时,它在我的pthread_join语句处中断。 for (i = 0; i < numThreads; ++i) { pt
我使用pthread_create()创建了一个线程。新线程创建成功,控制权传递给新创建的线程。然而,主线程似乎不再执行了。主线程处于无限循环中并且永远不会退出。以下是代码片段: void *star
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Multiple arguments to function called by pthread_creat
我在 GCC 中运行我的程序时遇到了段错误。这是一个相当长的程序,所以我只发布我认为相关的部分;如果需要更多信息,请告诉我。 void *RelaxThread(void *para) { p
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
所以我之前就一个具体问题提出了一个问题。我已经查看了该网站上的其他问题,但大多数问题都没有解决我的问题,特别是尽管我认为这个问题对其他初学者很有用。这是代码。 (pi.h) 我的结构是如何布局的 #i
我是 C 新手,这些指针的概念对我来说非常困惑。我试图做一些看起来很简单的事情,但我遇到了很多编译错误。 我想生成一个新线程并将多个指针作为参数传递给它(似乎在 c 中使用全局变量的唯一方法是通过指针
我一生都无法弄清楚为什么这是段错误。 这是段错误 get_ranks_parallel 上线 for (struct node* node = data->plist->head; node!=NUL
我的服务器正在向客户端发送 udp 数据报,并在数据包丢失时从客户端接收 NACK 数据报。我想创建一个线程来处理每个 NACK 数据包,但只有当我有东西要从客户端接收时我才想创建线程。为此,我想使用
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我看过pthread_create的文档 在底部的示例中,他们使用的是: pthread_create(&tinfo[tnum].thread_id, &attr, &thread_start, &t
我需要将多个参数传递给我想在单独线程上调用的函数。我有read执行此操作的典型方法是定义一个结构体,向函数传递一个指向该结构体的指针,并为参数取消引用它。但是,我无法让它工作: #include #
所以我试图编写一个程序,在c中创建一个线程,其工作是找到2个给定数字中的最大值。我编写的第一个程序(名为askisi.c)如下: #include #include #include int m
程序中存在两个问题首先,当我在主函数中取消注释 pthread_join() 时,会出现段错误,否则程序将运行...其次,输出文件将丢失上次读取文件中存储在全局变量words中的每个单词的第一个字母。
我是一名优秀的程序员,十分优秀!