Tag: pthreads

在c中编写并行快速排序

我需要使用pthreads在c中编写并行快速排序。 这就是我到目前为止所做的。 #include #include #include #include #include // sleep() #include #include // EXIT_SUCCESS #include // strerror() #include #define SIZE_OF_DATASET 6 void* quickSort( void* data); int partition( int* a, int, int); struct info { int start_index; int* data_set; int end_index; }; int main(int argc, char **argv) { int a[] = { 7, 12, 1, -2,8,2}; pthread_t […]

pthread_kill没有杀死线程C linux

我正在制作一个小项目,将其纳入更大的项目。 它的作用基本上是跟踪通过将它们添加到主结构而创建的线程,主结构跟踪线程的作用(主要function)和pthread_t id。 另一个struct跟踪要传递给函数的数据以及pthread_t id存储在threads []中的元素号。 它有点micky鼠标,它跳了一下但是除了什么时候杀死线程它都有效。 我得到没有段错误和没有错误,程序完成得很好,但是当调用pthread_kill()时,线程不会被杀死(函数返回0表示没有错误并且它有效)尽管线程继续运行直到主应用程序返回。

递归调用中pthread的分段错误

鉴于下面的代码,如果我运行n> 16,我会遇到分段错误。 我认为它与堆栈有关,但我无法弄明白。 有人能帮我一把吗? 代码不是我的,真的不重要。 我希望有人能帮助我了解正在发生的事情。 这个问题非常相似,但是没有足够的信息(发布答案的人简要地谈到了这个问题,然后继续谈论另一种语言)。 此外,请注意,有两个演出并且没有递归,我可以(如果我做得对)成功创建超过16000个线程(尽管操作系统仅创建大约500个并且运行大约300个)。 无论如何,我在哪里得到seg故障,为什么? 谢谢。 #include #include static void* fibonacci_thread( void* arg ) { int n = (int)arg, fib; pthread_t th1, th2; void* pvalue; /*Holds the value*/ switch (n) { case 0: return (void*)0; case 1: /* Fallthru, Fib(1)=Fib(2)=1 */ case 2: return (void*)1; default: break; } pthread_create(&th1, NULL, fibonacci_thread, […]

如何通过Linux上的静态库同步进程?

我有一个家庭作业项目,需要创建一个STATIC库来提供对几个命名管道的相互访问。 这些管道用于使用库和服务器的各种客户端之间的通信。 现在,假设我想使用pthread互斥量; 我怎么能实现这一目标? 进程如何知道哪个是存储互斥锁的共享内存区域? 谁应该要求这个记忆区? 服务器不能,因为它需要库本身提供互斥。 感谢asveikau我想出了这个: #define SHARED 1 #define MUTEX 1 int main() { sem_t* mutex = sem_open(“mutex”, O_CREAT); sem_init(mutex, SHARED, MUTEX); fork(), fork(), fork(); sem_wait(mutex); int i; for(i = 0; i < 10; i++) printf("process %d %d\n", getpid(), i), fflush(stdout); sem_post(mutex); } 从输出真的似乎解决了我的问题。 谢谢大家。

多个线程在循环中运行时如何影响索引

我试图编写一个运行5个线程并相应打印其索引的程序。 以下是代码: #include #include #include int nthreads=5; void *busy(void* c) { int my_busy = *(int *) c; printf(“Hello World with thread index %d\n”, my_busy); return NULL; } int main() { pthread_t t1[nthreads]; void* result; for(int i=0; i<nthreads; i++) { pthread_create(&t1[i], NULL, busy, &i); } for(int i=0; i<nthreads; i++) { pthread_join(t1[i], &result); } return 0; } […]

取消或杀死pthread

gcc (GCC) 4.6.3 valgrind-3.6.1 我创建了一个应用程序,在2个不同的线程中发送和接收一些消息,用于发送和接收。 使用pthreads,条件可变和锁定互斥锁。 但是,发送方将发送消息,然后通知接收方接收消息并进行处理。 它在while循环中执行此操作。 但是,如果我想通过使用ctrl-c并处理中断来退出应用程序,则会出现问题。 如果没有发送消息,则接收器卡在等待接收的while循环中。 主线程将调用join和block等待接收器完成。 但它没有等待pthread_cond_wait 。 我在考虑使用pthread_cancel或pthread_kill 。 但我不喜欢这样做,因为它不允许线程正常退出。 非常感谢任何建议。 主function void main(void) { /* Do some stuff here */ /* Start thread that will send a message */ if(pthread_create(&thread_recv_id, &thread_attr, thread_recv_fd, NULL) == -1) { fprintf(stderr, “Failed to create thread, reason [ %s ]”, strerror(errno)); break; } […]

C – 保证condvars已准备好发信号

我有一个简单的应用程序,可以与不同的硬件接口。 对于每个硬件,我针对一个独特的监视器函数生成一个pthread_t ,共有6个线程:1个管理器线程和5个工作线程。 每个线程都有一个通用的初始化例程,它等待管理器线程通过以下方式唤醒它: pthread_mutex_lock(&mMutex); pthread_cond_wait(&mMutex, &condVar); pthread_mutex_lock(&mMutex); 然后主线程通过一次发出一个信号来唤醒所有线程: pthread_cond_wait(&mMutex1, &condVar1); pthread_cond_wait(&mMutex2, &condVar2); … pthread_cond_wait(&mMutex5, &condVar5); 代码实际上工作正常,但这是因为我对时机很幸运。 当主/管理器线程发出pthread_cond_signal ,存在远程但存在的机会,即线程尚未完成初始化。 我需要找到一种方法来保证每个条件变量都有相应的工作线程对它进行了wait调用。 我总是可以创建一个在相应的互斥锁中设置的状态布尔值,但据我所知,我无法在一条指令中primefaces地执行set和wait操作。 我也可以使用pthread_barrier_t ,但这只是保证所有线程在进行各自的wait调用之前都是一个或两个指令。 是否有一种可靠的方法来确定已经进行了wait调用,或者我是否需要采用某种定时等待循环/检查方法? 谢谢。

pthread_join中的“状态”到底是什么以及如何查询它

我想知道pthread_join中的“status”参数到底是什么 int pthread_join(pthread_t thread, void **status); 我正在尝试使用它,但我无法理解它究竟代表什么。 根据文件 状态 Is the location where the exit status of the joined thread is stored. 如果不需要退出状态,则可以将其设置为NULL。 好。 听起来很棒。 我该如何使用它? 我已经看了一些例子,但我无法理解它(有些例子在使用它时是完全错误的)。 所以我确实去了源头。 在glibc实现中,我找到了pthread_join的以下测试: … pthread_t mh = (pthread_t) arg; void *result; … if (pthread_join (mh, &result) != 0) { puts (“join failed”); exit (1); } here follows the WTF […]

C线程和加入

我有一个关于C线程及其返回值的问题。 我的目标是找到起始编号和结束编号之间的所有素数。 我将有4个线程,每个线程执行四分之一的范围。 例如,1到100之间的素数。 线程1找到1到25之间的素数 线程2 26 – 50 线程3 51 – 75 线程4 76 – 100 所有素数都将存储在一个数组中,并且会有一个计算素数的函数。 我的问题是,当我加入线程时 pthread_join(tids[i], ptr); 将ptr指向所有素数的组合数组,1 – 100? 这意味着我使用for循环来打印值 printf(“%d”, ptr[i]); 它会将所有素数从1 – 100打印成一个大arrays吗? 我加入了4个独立的arrays吗? 谢谢

我的线程图像生成应用程序如何将其数据传递给gui?

Mandelbrot生成器的慢速多精度实现。 螺纹,使用POSIX线程。 Gtk GUI。 我有点失落。 这是我编写线程程序的第一次尝试。 我实际上并没有尝试转换它的单线程版本,只是试图实现基本框架。 到目前为止它的工作原理的简要说明: Main创建了watch_render_start线程,该线程等待pthread_cond_signal,当点击“render”按钮时,由GUI回调发出信号。 watch_render_start检查图像是否已经渲染,检查退出等,但如果一切顺利,则会创建render_create_threads线程。 然后render_create_threads线程创建渲染线程,然后使用pthread_join等待它们完成(并使用get_time_of_day进行一些计时 – 在线程中是不是很糟糕?)。 渲染线程的入口点(富有想象力)称为渲染,循环,而next_line计算函数返回TRUE,以便处理更多行。 在这个while循环中,有检查停止或退出。 next_line func在递增变量之前获取要计算的行,以指示下一个要计算的线程的下一行。 如果要处理的线超出图像高度,则返回。 如果没有,则计算该行的内容。 然后递增lines_done并根据图像的高度进行检查,如果> =则返回0,如果<,则返回1。 这里有470多行代码,我相信你会很开心。 #include #include #include #include #include #include #include /* build with: gcc threaded_app.c -o threaded_app -Wall -pedantic -std=gnu99 -lgmp -lmpfr -pthread -D_REENTRANT -ggdb `pkg-config –cflags gtk+-2.0` `pkg-config –libs gtk+-2.0` */ typedef struct { struct […]