Tag: pthreads

pthread_create没有足够的空间

我在Windows上使用Pthreads和MinGW。 对pthread_create的调用返回一个错误,该错误转换为“空间不足”。 它指的是什么样的空间? 是线程堆栈空间吗? int scannerThreadReturnValue = pthread_create(&parserThreadHandle, &attr, parserThread, (void *)filename); if(scannerThreadReturnValue != 0) { printf(“Unable to create thread %s\n”, strerror(errno)); } else printf(“Parser thread creation successfull\n”);

Pthread_t没有开始

我写了这个简短的例子,以便理解C中的线程编程。我应该编写“线程0”。 但是没有输出。 这是代码。 #include #include #include int i=0; pthread_mutex_t mutex; void * fonction(){ pthread_mutex_lock(&mutex); printf(“thread %d \n”,i++); pthread_mutex_unlock(&mutex); pthread_exit(NULL); } int main(){ pthread_t a; pthread_mutex_init(&mutex,NULL); pthread_create(&a,NULL,fonction,NULL); return EXIT_SUCCESS; } 有人能帮我吗 ? Ps:我用它来编译它 gcc -pthread test.c -o test

如何使用它来杀死线程数组?

这段代码工作正常,但如何使用它来杀死剩余线程数组? #include #include #include void *print1(void *tid) { pthread_t *td= tid; pthread_mutex_t lock1=PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&lock1); printf(“1”); printf(“2”); printf(“3”); printf(“4\n”); printf(“Coming out of thread1 \n”); sleep(2); pthread_mutex_unlock(&lock1); pthread_kill(*td,SIGKILL);//killing remaining all threads return NULL; } void *print2(void *arg) { pthread_mutex_t *lock = arg; pthread_mutex_lock(lock); sleep(5); printf(“5”); sleep(5); printf(“6”); sleep(5); printf(“7”); sleep(5); printf(“8\n”); fflush(stdout); pthread_mutex_unlock(lock); return NULL; } int […]

如何修复关于Mandelbrot集的Pthreads代码?

我有以下关于计算和创建Mandelbrot集图片的Pthreads代码。 我在C中的代码工作正常,它很好地打印出结果图片。 关键是使用下面的代码,我能够编译代码并执行它。 之后,如果我尝试在Gimp中查看生成的.ppm文件,则无法打开它。 我想我在代码中做错了。 如果有人可以帮助我,我会很高兴。 // mandpthread.c // to compile: gcc mandpthread.c -o mandpthread -lm -lrt -lpthread // usage: ./mandpthread > output.ppm #include #include #include #include #include #include typedef struct { int r, g, b; } rgb; int NITERATIONS, NTHREADS; rgb **m; void color(rgb **m, int x, int y, int red, int green, int […]

与struct指针共享内存互斥

我正在寻找一些关于我是否正确执行以下操作的反馈。 我正在努力移植一些Windows实时代码,这些代码大量使用了命名的互斥锁。 它需要一些搜索,但我遇到一些东西,说你可以使用共享内存作为linux中的互斥,使用shm open。 我不能在这里包含所有代码,但我将需要一些反馈的关键区域放在一起。 我的问题是如果我正确设置共享内存区域和互斥锁,以及我的指针是否设置正确,以及如何利用它来锁定/解锁。 volatile struct GenQ { volatile pthread_mutex_t *qMutexId volatile sem_t qSemId volatile int nexton volatile int nextoff } typedef struct Node{ void *qid char shmname[80] sem_t *semid pthread_mutex_t *mutexID struct node *next struct node *prev } void * init (const char *qname) { struct GenQ *myq; char mtxstr[80]; pthread_mutex_t *mutexQueAccess; […]

创建复制传递给它们的参数的线程

我目前正在使用boost :: thread,因为它非常方便地允许我将任意数量的参数传递给线程并沿途复制它们,所以我不必担心它们在线程启动之前被删除。 是否有其他库允许这样,或者使用pthreads模拟它? 我想让自己脱离激励,但我从未见过任何其他图书馆这样做。

MPI中的进程数量是否有限制?

我正在阅读“使用MPI”并尝试自己执行代码。 第6.3章中有一个网格分解代码。 它编译时没有任何警告或错误,并且使用少量进程运行,但在我的笔记本电脑上失败,但数量更大,比如30。 我的笔记本电脑是4核,超线程和8G内存。 la_grid_2d_new两个版本都不起作用,但第一个版本可以容忍更大的数字,比如35,但是40个进程失败了。 我不知道为什么。 请问你能帮帮我吗? 非常感谢。 #include #include #include typedef struct { int P, Q; int p, q; MPI_Comm grid_comm; MPI_Comm row_comm; MPI_Comm col_comm; } LA_Grid_2d; LA_Grid_2d *la_grid_2d_new(MPI_Comm comm, int P, int Q) { LA_Grid_2d *grid; MPI_Comm row, col; int my_rank, p, q; MPI_Comm_rank(comm, &my_rank); p=my_rank/Q; q=my_rank%Q; MPI_Comm_split(comm, p, q, &row); MPI_Comm_split(comm, q, […]

pthread参数的值已更改

这是我的主要function,其中NO_RECIEVERS = 3 。 我试图使用我发送的i的值来区分编写器和读取器线程。 int main() { int status, i; pthread_t tr[NO_RECIEVERS], tw[NO_SENDERS], bd; i=1; for(i=1; i<=NO_SENDERS; i++) { pthread_create(&tw[i-1], NULL, writer, &i); } for(i=1; i<=NO_RECIEVERS; i++) { printf("%d\n", i); pthread_create(&tr[i-1], NULL, reader, &i); } pthread_create(&bd, NULL ,daemon_thread, NULL); for(i=1; i<=NO_SENDERS; i++) { pthread_join(tw[i-1], NULL); } for(i=1; i<=NO_RECIEVERS; i++) { pthread_join(tr[i-1], NULL); } pthread_join(bd, […]

pthreads锁定恢复

我正在研究一个multithreading网络服务器应用程序。 目前,我遇到了锁定恢复问题。 如果一个线程在持有锁时意外死亡,比如一个互斥锁,rwlock,自旋锁……等,是否有可能从另一个线程恢复锁,而不必进入锁结构本身并手动取消所有者的关联从锁。 我想不必去这个极端来清除它,因为这将使代码不可移植。 我试图通过在违规线程上执行pthread_kill并查看返回代码来强制更改锁定所有者。 但即使使用PTHREAD_MUTEX_ERRORCHECK的互斥锁类型属性,如果锁定线程已退出,我仍然无法从另一个线程获得对互斥锁的控制。 如果在线程挽救时更新某个内部表,这可能会出现问题,因为它最终会导致整个服务器应用程序停止。 我已广泛使用Google,即使在这里,我也会收到相互矛盾的信息。 我可以探索的任何建议或想法? 这是在使用clang-llvm编译器的FreeBSD 9.3上。

POSIX信号量和pthread问题

我正在使用POSIX库练习信号量。 我试图通过一个信号量(代表一个服务器)传递线程(代表客户),这个信号量位于两个表(每个由sempahores控制)下的8个人。 我认为罪魁祸首是解锁和锁定多个信号量的顺序,但我似乎无法针对非法指令(核心转储)错误的来源。 EDITED – 互斥初始化的反向顺序和创建线程循环 – 添加返回NULL到eat()的结尾: #include #include #include #include sem_t server_sem; int server_pshared; int server_ret; int server_count = 10; sem_t tablea_sem; int tablea_pshared; int tablea_ret; int tablea_count = 4; sem_t tableb_sem; int tableb_pshared; int tableb_ret; int tableb_count = 4; //server_ret = serm_open(“serverSem”, O_CREAT | O_EXCL, 0644, server_count); int customer_count = 10; pthread_t […]