c语言中锁的作用,C语言中的多线程死锁
我是C的新手,在下面的多线程场景中,N个线程从一个二进制文件中读取,并写入自己的单独文件,例如线程1写入文件1,线程2写入文件2,等等。
这对~2/3个线程有效,但对于其他线程,它似乎陷入了死锁,但我不确定问题的根源是什么。
干杯!:)
#include "tape.h"
#include
#include
#include
#include
#define BYTE unsigned char
int present_file = 0;
pthread_t THREADS[100];
int OFFSET[100];
FILE * file;
pthread_mutex_t read_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t finished_read_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t file_read = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t read_cond = PTHREAD_COND_INITIALIZER;
pthread_cond_t finished_read_cond = PTHREAD_COND_INITIALIZER;
int read = 0;
int finished_reading = 0;
int read_value;
size_t file_length;
int n_threads = 0;
void* tape_reader(void* args) {
int offset = *((int *) args);
FILE * file_ptr;
if(present_file == 1){
file_ptr = fopen("head1", "wb");
}
else if (present_file == 2){
file_ptr = fopen("head2", "wb");
}
else if (present_file == 3){
file_ptr = fopen("head3", "wb");
}
else if (present_file == 4){
file_ptr = fopen("head4", "wb");
}
else if (present_file == 5){
file_ptr = fopen("head5", "wb");
}
else if (present_file == 6){
file_ptr = fopen("head6", "wb");
}
else if (present_file == 7){
file_ptr = fopen("head7", "wb");
}
else if (present_file == 8){
file_ptr = fopen("head8", "wb");
}
else if (present_file == 9){
file_ptr = fopen("head9", "wb");
}
else if (present_file == 10){
file_ptr = fopen("head10", "wb");
}
else{
file_ptr = NULL;
}
while(read == 0){
pthread_cond_wait(&read_cond, &read_mutex);
}
//thread start reading
pthread_mutex_lock(&file_read);
BYTE buffer;
rewind(file);
fseek(file, offset, SEEK_SET);
for(int i = 0; i < read_value; i++){
if(i == file_length){
i = 0;
}
fread(&buffer, 1, sizeof(buffer), file);
fwrite(&buffer, 1, sizeof(buffer), file_ptr);
}
fclose(file_ptr);
pthread_mutex_unlock(&file_read);
return 0;
}
int main(int argc, char** argv) {
if(argc == 1){
printf("Tape Not Inserted\n");
return 1;
}
else if(argc == 2){
file = fopen(argv[1], "rb");
if(file == NULL){
printf("Cannot Read Tape\n");
return 1;
}
else{
fseek(file, 0, SEEK_END);
file_length = ftell(file);
rewind(file);
while(1){
char userInput[100];
int offset;
scanf("%s", userInput);
if(strcmp(userInput, "QUIT") == 0){
return 0;
}
//printf("%s\n", userInput);
if(strcmp(userInput, "HEAD") == 0){
scanf("%d", &offset);
pthread_create(THREADS + present_file, NULL, tape_reader, (void *) &offset);
n_threads++;
present_file++;
if(offset >= 0){
printf("HEAD %d at +%d\n", present_file, offset);
printf("\n");
}
else{
printf("HEAD %d at %d\n", present_file, offset);
printf("\n");
}
}
if(strcmp(userInput, "READ") == 0){
int read_for;
scanf("%d", &read_for);
read_value = read_for;
read = 1;
pthread_cond_signal(&read_cond);
//threads read
printf("Finished Reading\n\n");
for(int i = 0; i < n_threads; i++){
pthread_join(THREADS[i], NULL);
}
return 0;
}
}
}
}
}
c语言中锁的作用,C语言中的多线程死锁相关推荐
- c语言中锁的作用,c 互斥锁
互斥锁的作用保护共享数据: 在并发机制的情况下,有时候会有多个线程同时访问同一片数据,为了保护数据操作的准确性就需要通过加锁来进行保护.保持操作互斥: 可能一个程序会有多个操作,但是同一个时间只能有一 ...
- c语言程序中cost的作用,C语言考试题基础版(21页)-原创力文档
if (x>y)z=x; s=z*z;elsez=y;s=1/(z*z); if (x>y) z=x; s=z*z; else z=y;s=1/(z*z); 7. B. C. PAd, P ...
- c语言在中职的作用,C语言程序下的中职教学论文
一.树立学生良好的学习信心 在日常的中职计算机教育教学中,应当重视学生对教学内容的看法,大多数学生认为C语言学习相对较为困难,在日常的中职计算机学习中,学生某种程度上缺乏应有的信心以及勇气,而尽管有的 ...
- C语言switch中break的作用,C语言switch中break语句的作用
问题: break在for循环.while循环等循环流程控制中起的作用是停止执行break后面的语句,跳出本次循环,并跳出该循环控制体: 在switch条件选择中,没有了循环控制,break又起什么作 ...
- c语言程序头文件作用,C语言头文件
C语言头文件教程 C 语言的头文件一般都是 .h 做为结尾的. C语言头文件详解 语法 #include 参数 参数 描述 filename 我们需要引入的头文件的名称. 说明 C 语言的头文件一般都 ...
- c语言对编程对作用,c语言编程心得体会
c语言编程心得体会 c语言是在国内外广泛使用的一种计算机语言.以下是小编整理的c语言编程心得体会,欢迎大家阅读! c语言编程心得体会1 说到我学习c语言时,真是用千言万语呀!记得刚开始学的时候,我的c ...
- c语言的应用与作用,C语言主要应用在什么地方?
C语言是一种计算机程序设计语言.它既有高级语言的特点,又具有汇编语言的特点.它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序.因此,它的应用范围 ...
- c语言eof不起作用,c语言程序设计 怎么以输入EOF结束
EOF(EndOfFile)是C语言中的文件结束标志符.当C语言输入函数获取到文件结尾标志时,会通过返回值的方式体现该值.所以要以输入EOF为结束,就需要判断输入函数的返回值.EOF定义在stdio. ...
- c语言链表head的作用,c语言链表的用法
c语言链表的用法 链表是数据结构中比较基础也是比较重要的类型之一,那么有了数组,为什么我们还需要链表呢!或者说设计链表这种数据结构的初衷在哪里?下面小编就为大家介绍下c语言链表的用法. c语言枚举的用 ...
最新文章
- 【camera-radar】基于ROS的多传感器融合感知系统实现(雷达+相机)(1)
- 【ios开发/Xcode】实现简易省会问答
- pandas 索引与列相互转化
- Android构建boot.img(一):root目录与ramdisk.img的生成
- 用java编写简单Webserver,理解webserver的功能。
- php-calendar,PHPCalendar的函数简介
- golang语言变量定义、打印、占位符
- Session,Cookie,jsessionid,Url重写
- python 元类 详解_Python 元类详解 __new__、__init__、__call__、__metacalss__
- CVE-2021-21871: PowerISO 内存越界写漏洞
- linux不同内核驱动移植问题,基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)...
- 虚拟机的安装中遇到的问题(WIN10主机)
- diskgenius分区linux选哪项,DiskGenius和和傲梅分区助手哪个好 无损C盘扩容选谁
- 软件工程学习笔记(三)~顺序图模型
- 国内坐标转换常用投影EPSG
- 阿里云活动价格点击购买时价格上涨的解决办法
- (node:13684) UnhandledPromiseRejectionWarning: Unhandled promise rejection
- 绘画系统(02):【纲】Paint Devices and Backends[官翻]
- faster rcn固定输入图片尺寸(一)
- 超详细的Asp.net使用SSL双向认证,一篇就够了
热门文章
- mysql密码攻击_MYSQL用户root密码为弱口令又一攻击方法
- sublime安装与使用
- TabTopUnderLineLayout【自定义顶部选项卡(带下划线)】
- Android零基础入门第26节:layout_gravity和gravity大不同
- salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)...
- ES5中的有9个Array方法
- linux 0.11 源码学习(二)
- ACM MM2021 | 腾讯优图实验室9篇论文入选,含弱监督图像描述及定位、表格结构识别等研究方向...
- 人脸检测,微软提出用RNN代替CNN
- MIT“35岁以下科技创新35人”榜单揭晓