Tag: pthreads

具有实时优先级的pthreads

我需要管理具有不同优先级的线程池,因此我编写了以下线程启动过程: static int startup(thrd_t *thrd, thrd_sync_t *sync, int prio) { pthread_attr_t attr; int err; struct sched_param param = { .sched_priority = prio }; assert(pthread_attr_init(&attr) == 0); assert(pthread_attr_setschedpolicy(&attr, SCHED_FIFO) == 0); assert(pthread_attr_setschedparam(&attr, &param) == 0); err = pthread_create(&thrd->handler, &attr, thread_routine, (void *)thrd); pthread_attr_destroy(&attr); return err; } 原则上,不应允许非特权用户执行此代码:pthread_create()调用应返回EPERM,因为运行具有高优先级的线程具有安全隐患。 出乎意料的是,它适用于普通用户,但它根本不尊重给定的优先级。 我尝试通过删除pthread_attr_t并在创建线程后设置调度属性来修改代码: static int startup(thrd_t *thrd, thrd_sync_t *sync, int […]

pthreads in C – pthread_exit

出于某种原因,我认为在main函数结束时调用pthread_exit(NULL)将保证所有正在运行的线程(至少在main函数中创建)将在main退出之前完成运行。 但是,当我在不调用两个pthread_join函数(在main的末尾)运行下面的代码时,我明显得到一个分段错误,这似乎是因为main函数在两个线程完成它们的工作之前已经退出,因此char缓冲区不再可用。 但是,当我在main的末尾包含这两个pthread_join函数调用时,它应该按原样运行。 为了保证main在所有正在运行的线程完成之前不会退出,是否有必要为main直接初始化的所有线程显式调用pthread_join ? #include #include #include #include #include #include #define NUM_CHAR 1024 #define BUFFER_SIZE 8 typedef struct { pthread_mutex_t mutex; sem_t full; sem_t empty; char* buffer; } Context; void *Reader(void* arg) { Context* context = (Context*) arg; for (int i = 0; i full); pthread_mutex_lock(&(context->mutex)); char c = context->buffer[i % BUFFER_SIZE]; pthread_mutex_unlock(&(context->mutex)); sem_post(&context->empty); […]

如何在linux中配置pthread互斥?

我想知道如何配置pthread互斥锁以查看我的代码中是否存在任何锁定争用点。 (谁喜欢有争议的代码,对吧?:)我知道如何对代码进行更全面的分析,正如我在这里提到的那样。 但我想知道是否有任何工具或选项可用于配置互斥锁定,这将提供有关互斥锁定争用的指标/统计数据,以查看我是否有任何问题区域。 这是一些背景和背景: 最近我使用Cavium Octeon CPU开发了一个嵌入式C ++项目。 Octeon SDK使用自旋锁实现互斥式样式同步。 通过Octeon文档,我发现了一种分析自旋锁的方法,以便能够看到每个自旋锁在等待锁变为可用时必须旋转多少次。 要使用它,我必须进行条件编译,然后每次自旋锁旋转时它会增加一个计数器,然后我可以查询微调器等待值。 所以,我所做的是封装自旋锁并添加了为系统中使用的所有自旋锁转储自旋锁微调器等待值的function。 实际值并没有多大意义,但有一些与其他人相比具有非常高的价值,我专注于减少对这些人的争论。 我知道这对于自旋锁来说可能相当容易,因为它只是每次旋转一个计数器,但通过相关的pthread手册页和头文件读取我没有找到类似的东西,是否有可用于pthread互斥锁? 我真的很想避免像每次锁定之前和之后花时间做一些hacky。 PS:互斥体的复数是多少? 互斥,muteces,mutexi,muti ??? 互斥量从来没有对我说话。

fork(应该是)在线程程序中对信号处理程序是否安全?

我真的不确定POSIX在存在线程和信号时对fork的安全性的要求。 fork被列为异步信号安全函数之一,但是如果库代码有可能注册了非异步信号安全的pthread_atfork处理程序,这会否定fork的安全性吗? 答案取决于运行信号处理程序的线程是否正在使用atfork处理程序所需的资源? 或者换句话说,如果atfork处理程序使用同步资源(互斥体等),但是从一个永远不会访问这些资源的线程中执行的信号处理程序调用fork ,程序是否符合要求? 在这个问题的基础上,如果使用pthread_atfork建议的习语在系统库内部实现“线程安全”分叉(获取prefork处理程序中的所有锁并释放父和子postfork处理程序中的所有锁),那么就是fork在线程程序中使用信号处理程序是否安全? 处理信号的线程是否可能在调用malloc或fopen / fclose并持有全局锁的过程中,导致fork期间出现死锁? 最后,即使fork在信号处理程序中是安全的,在信号处理程序中fork然后从信号处理程序返回是安全的,或者在信号处理程序中调用fork总是需要后续调用_exit或其中一个exec信号处理程序返回之前的函数族?

如何使用pthread_atfork()和pthread_once()重新初始化子进程中的互斥锁

我们有一个C ++共享库,它使用ZeroC的Ice库来实现RPC,除非我们关闭Ice的运行时,否则我们观察到子进程挂在随机互斥锁上。 Ice运行时启动线程,具有许多内部互斥锁并保持打开文件描述符到服务器。 另外,我们有一些我们自己的互斥体来保护我们的内部状态。 我们的共享库被数百个内部应用程序使用,因此我们无法控制进程何时调用fork(),因此我们需要一种方法来安全地关闭Ice并在进程分叉时锁定我们的互斥锁。 在pthread_atfork()上读取处理互斥锁和内部状态的POSIX标准: 或者,某些库可能只能提供一个子例程,它将库中的互斥锁和所有关联状态重新初始化为某个已知值(例如,最初执行映像时的状态)。 但是,这种方法是不可能的,因为如果互斥锁或锁仍然被锁定,则允许实现失败* _init()和* _destroy()调用互斥锁和锁。 在这种情况下,子例程无法重新初始化互斥锁和锁。 在Linux上,此测试C程序从子pthread_atfork()处理程序中的pthread_mutex_unlock()返回EPERM。 Linux需要将_NP添加到PTHREAD_MUTEX_ERRORCHECK宏以便进行编译。 这个程序是从这个好的线程链接的。 鉴于解锁或破坏子代中的互斥锁在技术上是不安全或合法的,我认为最好有指向互斥锁的指针,然后让孩子在堆上创建新的pthread_mutex_t并让父项的互斥量单独使用,从而拥有小内存泄漏。 唯一的问题是如何重新初始化库的状态,我正在考虑重新设置pthread_once_t。 也许是因为POSIX有一个pthread_once_t的初始化程序,它可以重置为初始状态。 #include #include #include static pthread_once_t once_control = PTHREAD_ONCE_INIT; static pthread_mutex_t *mutex_ptr = 0; static void setup_new_mutex() { mutex_ptr = malloc(sizeof(*mutex_ptr)); pthread_mutex_init(mutex_ptr, 0); } static void prepare() { pthread_mutex_lock(mutex_ptr); } static void parent() { pthread_mutex_unlock(mutex_ptr); } static void child() […]

c pthread传递int类型的数组

我传递一个int pthread_create类型的数组并得到错误: histogram.c:138:3: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default] expected ‘void * (*)(void *)’ but argument is of type ‘void * (*)(int *)’ void *output_results(); pthread_create(&t2, NULL, output_results, (void *)bins); void *output_results(int *bins) { some code }

是否有必要调用pthread_join()

我从main()创建了100多个线程,所以我只想知道在退出main()之前需要调用pthread_join()。 此外,我不需要这些线程生成的数据,基本上所有线程都在做一些独立于main()和其他线程的工作。

如何在没有连接的情况下同步管理器/工作线程pthreads?

我熟悉multithreading,并且已经成功地用Java和Objective-C开发了许多multithreading程序。 但是在没有使用主线程的连接的情况下,我无法使用pthreads在C中实现以下内容: #include #include #include #define NUM_OF_THREADS 2 struct thread_data { int start; int end; int *arr; }; void print(int *ints, int n); void *processArray(void *args); int main(int argc, const char * argv[]) { int numOfInts = 10; int *ints = malloc(numOfInts * sizeof(int)); for (int i = 0; i < numOfInts; i++) { ints[i] […]

如何提供一系列交错线程来表明代码中断并且不能提供完美的同步?

我知道下面的代码做了什么,我知道为什么它是一个破碎的同步代码,因为它只有一个条件变量,而我们需要两个,但我不知道如何提供一个交错线程序列,以显示它不起作用。 你能说明为什么这段代码不适用于一个例子吗? 1 cond_t cond = PTHREAD_COND_INITIALIZER; 2 mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;; 3 4 void *producer(void *arg) { 5 int i; 6 for (i = 0; i < loops; i++) { 7 Pthread_mutex_lock(&mutex); 8 while (count == 1) 9 Pthread_cond_wait(&cond, &mutex); 10 put(i); 11 Pthread_cond_signal(&cond); 12 Pthread_mutex_unlock(&mutex); 13 } 14 } 15 16 void *consumer(void *arg) { […]

什么是PTHREAD_MUTEX_ADAPTIVE_NP

在哪里可以找到“自适应”pthread互斥锁的文档? 符号PTHREAD_MUTEX_ADAPTIVE_NP是在我的系统上定义的,但我在网上找到的唯一文档没有说明自适应互斥锁是什么,或者什么时候适合使用。 那么……它是什么,我什么时候应该使用它? 作为参考,我的libc版本是: GNU C Library (Ubuntu EGLIBC 2.15-0ubuntu10.5) stable release version 2.15, by Roland McGrath et al. Copyright (C) 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Compiled by GNU CC version […]