segmentation-fault - PThread 分段错误,增量器/减量器
问题描述
我不断收到 Seg Fault,我假设它试图访问过去不退出的 DECREMENTORS 4。
我添加了几个打印语句来帮助缩小问题范围。
我试图创建的是线程和变量的简单递增、递减程序。
我也考虑过使用结构来存储变量,但是我不确定这是否是一个好主意。
/* readerswriters.c */
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define READERS 10
#define INCREMENTORS 5
#define DECREMENTORS 4
sem_t s;
int sum = 0;
int counter = 0;
int total = 0;
void *incrementorfunc(void *arg)
{
int *me;
me = (int *)arg;
sem_wait(&s);
sum++;
printf("Incrementor %d set sum = %d\n", *me, sum);
sem_post(&s);
pthread_exit(NULL);
}
void *decrementorfunc(void *arg)
{
int *me;
me = (int *) arg;
//Problem is in here i believe
sem_wait(&s);
sum--;
printf("Decrementor %d set sum = %d\n", *me, sum);
sem_post(&s);
//printf("hello\n");
pthread_exit(NULL);
}
int main(void)
{
int i;
pthread_t iID[INCREMENTORS];
int increID[INCREMENTORS];
pthread_t dID[DECREMENTORS];
int decreID[DECREMENTORS];
counter = 0;
for(i = 0; i < INCREMENTORS; i++){
increID[i] = i;
}
for(i = 0; i < DECREMENTORS; i++){
decreID[i] = i;
}
sem_init(&s, 0, 1);
for(i = 0; i < INCREMENTORS; i++){
pthread_create(&iID[i], NULL, incrementorfunc, (void *)&increID[i]);
}
for(i = 0; i < DECREMENTORS; i++){
pthread_create(&dID[i], NULL, decrementorfunc, (void *)&decreID[i]);
}
for(i = 0; i< INCREMENTORS; i++){
pthread_join(increID[i], NULL);
}
for(i = 0; i < DECREMENTORS; i++){
pthread_join(decreID[i], NULL);
}
return 0;
}
解决方案
推荐阅读
- powershell - 使用变量列表列出文件夹?
- loops - 删除 Rust 循环中的边界检查以尝试达到最佳编译器输出
- php - php openssl_csr_new():错误签名请求调试
- sequelize.js - Sequelize 查询由 $and 连接的 2 个函数
- javascript - 文本被截断时的 CSS 选择
- kotlin - 变换单
- >> 转单
- >
- tensorflow - 根据点的数量和大小,使用哪种神经网络将点状图像分类为一个数字?
- c# - cryptuiapi.h 和 wincrypt.h 是否有 C# 包装器?
- autodesk-forge - 重命名 Bucket 或转移所有模型
- vue.js - VueJS - 本地主机 API 请求在 Android Chromium 上不起作用