gpt4 book ai didi

c - pthread_join() 和卡住执行

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:22 29 4
gpt4 key购买 nike

我试图构建一个具有模拟时间执行的系统(在 Linux 中),协调线程与信号量,其想法是让它们的所有工作周期为一秒,以便准确模拟线程必须每隔一个等待线程在当前模拟秒结束执行。

我有一个非常烦人的内存泄漏,因为主线程完成了工作而没有加入其他线程(新手错误),所以为了解决这个问题,我为每个线程添加了 pthread_join() 指令,假设它们正在完成它的工作,因为每个线程执行都在一个 while 循环中,具有要检查的全局条件,在完成之前由主线程更改。遗憾的是,即使如此,现在,程序的大部分执行都被卡住,等待线程完成。

我需要找到一种方法来结束每个线程的执行,甚至忽略它的全部工作,但要确保进行了连接(这样内存就被释放了)。

现在我发布了一个有错误的可编译代码,你可以用 gcc -o sample -pthread sample.c -lm 编译它

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <pthread.h>
#include <semaphore.h>
#include <math.h>

#define SIZE 100
#define READY 12345
#define END 99
#define TIME 3600
int *advicer;
int *td;
pthread_t *phones;
sem_t *counter;
int ready;
int end;

void cycle(int cycles){
int i,j,k;
for(i = 0; i < cycles; i++){
k = 1;
while(k){
k = 0;
for(j = 0; j < SIZE; j++){
if(advicer[j] == 0){
k = 1;
break;
}
}
}
for(j = 0; j < SIZE; j++){
advicer[j] = 0;
sem_post(&counter[j]);
}
}
}

void *do_something(void *td){
int t;
t = *((int *) td);
while(end != END){
if(end == END)
break;
t += t;
advicer[t] = 1;
sem_wait(&counter[t]);
}
pthread_exit(NULL);
}

void all_free(){
int i,j;
end = END;
printf("reach %d\n",end);
for(i = 0; i < SIZE; i++)
sem_post(&counter[i]);
printf("reach2\n");
for(i = 0; i < SIZE; i++){
pthread_join(phones[i],NULL);
}
free(phones);
printf("reach3\n");
for(i = 0; i < SIZE; i++)
sem_destroy(&counter[i]);
free(counter);
free(td);
free(advicer);
}

void main(){
int i,my_count;
counter = (sem_t *)malloc(sizeof(sem_t)*SIZE);
advicer = (int *)malloc(sizeof(int)*SIZE);
td = (int *)malloc(sizeof(int)*SIZE);
phones = (pthread_t *)malloc(sizeof(pthread_t)*SIZE);
for(i = 0; i < SIZE; i++){
sem_init(&counter[i], 0, 0);
advicer[i] = 0;
}
ready = READY;
my_count = 0;
end = 0;
for(i = 0; i < SIZE; i++){
td[i] = i;
pthread_create(&(phones[i]), NULL, do_something, (void *)(&td[i]));
}
printf("starting simulation\n");
while(my_count < TIME){
cycle(60);
printf("hello\n");
my_count += 60;
}
printf("simulation ended\n");
all_free();
}

最佳答案

以下部分可能导致锁定:

for(i = 0; i < m->pp; i++)
sem_post(&counter[i]);
for(i = 0; i < m->pp; i++){
if(m->ppl[i] != NULL){
phone_free(m->ppl[i]);
}
...
}

你只为一个线程调用sem_post()(解锁它)然后调用pthread_join()(通过phone_free())所有线程,除了您为其调用 sem_post() 的线程外,其他所有线程都会阻塞,因为其他线程不会终止,因为卡在 sem_wait() 中。

尽管您在主执行期间调用了 sem_post() ( cycle()),但该值可能已在您执行之前由线程获取调用结束执行代码 ( map_free()) pthread_join()(通过 phone_free())。

要取消线程,您可以使用 pthread_cancel()

为避免在离开线程且未对其调用 pthread_join() 时发生内存泄漏,您可以使用 pthread_detach() 分离线程。然后,操作系统在线程终止时释放线程的所有资源。

关于c - pthread_join() 和卡住执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9539286/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com