Tag: pthreads

如何干净地中断recv调用中的线程阻塞?

我有一个用C编写的multithreading服务器,每个客户端线程看起来像这样: ssize_t n; struct request request; // Main loop: receive requests from the client and send responses. while(running && (n = recv(sockfd, &request, sizeof(request), 0)) == sizeof(request)) { // Process request and send response. } if(n == -1) perror(“Error receiving request from client”); else if(n != sizeof(act)) fprintf(stderr, “Error receiving request from client: Incomplete data\n”); […]

posix regcomp和regexec线程是否安全? 具体来说,在GNU libc上?

这里有两个独立的问题:我可以在没有锁定的multithreading程序中使用正则表达式,如果是这样,我可以在多个线程中同时使用相同的regex_t吗? 我无法在Google或联机帮助页上找到答案。

pthread_mutex_lock锁定,但未设置所有者

我已经在这个工作了几天 – 作为背景,我正在研究一个单线程C程序并使其成为multithreading。 我最近发现了一个新的死锁情况,但是当我看到gdb中的互斥锁时,我看到了 __lock = 2但是__owner = 0 这不是递归的互斥锁。 有没有人见过这个? 我正在处理的程序是一个守护程序,这种情况只发生在以高吞吐率执行超过20分钟(大约)然后放松负载之后。 如果您有任何想法,我将不胜感激。 编辑 – 我忽略了提到我的所有其他线程此时都处于空闲状态。 干杯

从不同大小的整数,pthread代码转换为指针

我有这个代码用于矩阵乘法,使用pthreads,但我得到错误“从不同大小的整数转换为指针” 我不知道出了什么问题。我是pthread的新手,这是我到目前为止所做的: #include #include #include #include #include #define NTHREADS 4 int dim ; pthread_mutex_t m; /* Mutex protecting the sum value */ pthread_t thread_id[NTHREADS]; /* Thread ids */ float **A, **B, **C; void *prod (void *s){ int *id=(int *)s; int idd=*id; /* Define local variables */ int i,j,k, start, end, len ; float **Aa, **Bb, […]

一旦pthread_barrier_wait返回,屏障怎么可以破坏?

这个问题基于: 什么时候摧毁pthread屏障是否安全? 和最近的glibc错误报告: http://sourceware.org/bugzilla/show_bug.cgi?id=12674 我不确定在glibc中报告的信号量问题,但据推测,一旦pthread_barrier_wait返回,它应该是有效的,以便根据上述链接问题消除障碍。 (通常,获得PTHREAD_BARRIER_SERIAL_THREAD的线程或已经认为自己对屏障对象“负责”的“特殊”线程将是销毁它的那个。)我能想到的主要用例是当使用屏障时同步新线程在创建线程堆栈上使用数据,防止创建线程返回,直到新线程使用数据为止; 其他障碍可能具有与整个程序相同的生命周期,或由其他一些同步对象控制。 在任何情况下,只要pthread_barrier_wait在任何线程中返回,实现如何确保屏障的破坏(甚至可能取消映射它所驻留的内存)都是安全的? 似乎尚未返回的其他线程需要检查屏障对象的至少某些部分才能完成其工作并返回,就像在上面引用的glibc错误报告中一样, sem_post必须检查服务员计数后调整了信号量值。

虚假分享和pthreads

我有以下任务来演示虚假共享并编写了一个简单的程序: #include #include #include #include long long int tmsBegin1,tmsEnd1,tmsBegin2,tmsEnd2,tmsBegin3,tmsEnd3; int array[100]; void *heavy_loop(void *param) { int index = *((int*)param); int i; for (i = 0; i < 100000000; i++) array[index]+=3; } int main(int argc, char *argv[]) { int first_elem = 0; int bad_elem = 1; int good_elem = 32; long long time1; long long time2; […]

如何停止正在运行的pthread线程?

如何立即退出或停止线程? 当用户输入答案时,如何立即停止? 我想让它重置每一个问题。 这是涉及线程的代码 int q1() { int timer_start; char ans[] = “lol”; char user_ans[50]; timer_start = pthread_create( &xtimer,NULL,(void*)timer_func,(void*)NULL); printf(“What is the capital city of Peru?\n”); while(limit){ scanf(“%s”,user_ans); if(limit) { if(!strcmp(user_ans, ans)) { // printf(“YAY!\n”); score++; // q2(); } else { game_over(); } } } }

如何将多个参数传递给C中的线程

我试图将两个参数传递给C中的一个线程。我创建了一个数组(大小为2),并试图将该数组传递给线程。 这是将多个参数传递给线程的正确方法吗? // parameters of input. These are two random numbers int track_no = rand()%15; // getting the track number for the thread int number = rand()%20 + 1; // this represents the work that needs to be done int *parameters[2]; parameters[0]=track_no; parameters[1]=number; // the thread is created here pthread_t server_thread; int server_thread_status; //somehow pass […]

pthreads中的内存模型规范

是否有任何保证何时在一个线程中的内存写入在使用pthread s的其他线程中可见? 与Java相比,Java语言规范有一个部分,它指定了锁和内存的交互,从而可以编写可移植的multithreadingJava代码。 是否有相应的pthreads规范? 当然,你总是可以让共享数据变得不稳定,但这不是我所追求的。 如果这取决于平台,是否有事实上的标准? 或者是否应该使用另一个线程库?

将struct作为参数传递给pthread

好吧,我试图通过struct将一对数字传递给pthread pthread_create函数。 但是我传递的数字和调用函数时得到的数字是不同的和随机的 这是struct struct Pairs { long i,j; }; 并在主要内部 void main() { long thread_cmp_count = (long)n*(n-1)/2; long t,index = 0; struct Pairs *pair; pair = malloc(sizeof(struct Pairs)); cmp_thread = malloc(thread_cmp_count*sizeof(pthread_t)); for(thread = 0;(thread < thread_cmp_count); thread++){ for(t = thread+1; t < n; t++){ (*pair).i = thread; (*pair).j = t; pthread_create(&cmp_thread[index++], NULL, Compare, (void*) […]