我是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语言中的多线程死锁相关推荐

  1. c语言中锁的作用,c 互斥锁

    互斥锁的作用保护共享数据: 在并发机制的情况下,有时候会有多个线程同时访问同一片数据,为了保护数据操作的准确性就需要通过加锁来进行保护.保持操作互斥: 可能一个程序会有多个操作,但是同一个时间只能有一 ...

  2. 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 ...

  3. c语言在中职的作用,C语言程序下的中职教学论文

    一.树立学生良好的学习信心 在日常的中职计算机教育教学中,应当重视学生对教学内容的看法,大多数学生认为C语言学习相对较为困难,在日常的中职计算机学习中,学生某种程度上缺乏应有的信心以及勇气,而尽管有的 ...

  4. C语言switch中break的作用,C语言switch中break语句的作用

    问题: break在for循环.while循环等循环流程控制中起的作用是停止执行break后面的语句,跳出本次循环,并跳出该循环控制体: 在switch条件选择中,没有了循环控制,break又起什么作 ...

  5. c语言程序头文件作用,C语言头文件

    C语言头文件教程 C 语言的头文件一般都是 .h 做为结尾的. C语言头文件详解 语法 #include 参数 参数 描述 filename 我们需要引入的头文件的名称. 说明 C 语言的头文件一般都 ...

  6. c语言对编程对作用,c语言编程心得体会

    c语言编程心得体会 c语言是在国内外广泛使用的一种计算机语言.以下是小编整理的c语言编程心得体会,欢迎大家阅读! c语言编程心得体会1 说到我学习c语言时,真是用千言万语呀!记得刚开始学的时候,我的c ...

  7. c语言的应用与作用,C语言主要应用在什么地方?

    C语言是一种计算机程序设计语言.它既有高级语言的特点,又具有汇编语言的特点.它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序.因此,它的应用范围 ...

  8. c语言eof不起作用,c语言程序设计 怎么以输入EOF结束

    EOF(EndOfFile)是C语言中的文件结束标志符.当C语言输入函数获取到文件结尾标志时,会通过返回值的方式体现该值.所以要以输入EOF为结束,就需要判断输入函数的返回值.EOF定义在stdio. ...

  9. c语言链表head的作用,c语言链表的用法

    c语言链表的用法 链表是数据结构中比较基础也是比较重要的类型之一,那么有了数组,为什么我们还需要链表呢!或者说设计链表这种数据结构的初衷在哪里?下面小编就为大家介绍下c语言链表的用法. c语言枚举的用 ...

最新文章

  1. 【camera-radar】基于ROS的多传感器融合感知系统实现(雷达+相机)(1)
  2. 【ios开发/Xcode】实现简易省会问答
  3. pandas 索引与列相互转化
  4. Android构建boot.img(一):root目录与ramdisk.img的生成
  5. 用java编写简单Webserver,理解webserver的功能。
  6. php-calendar,PHPCalendar的函数简介
  7. golang语言变量定义、打印、占位符
  8. Session,Cookie,jsessionid,Url重写
  9. python 元类 详解_Python 元类详解 __new__、__init__、__call__、__metacalss__
  10. CVE-2021-21871: PowerISO 内存越界写漏洞
  11. linux不同内核驱动移植问题,基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)...
  12. 虚拟机的安装中遇到的问题(WIN10主机)
  13. diskgenius分区linux选哪项,DiskGenius和和傲梅分区助手哪个好 无损C盘扩容选谁
  14. 软件工程学习笔记(三)~顺序图模型
  15. 国内坐标转换常用投影EPSG
  16. 阿里云活动价格点击购买时价格上涨的解决办法
  17. (node:13684) UnhandledPromiseRejectionWarning: Unhandled promise rejection
  18. 绘画系统(02):【纲】Paint Devices and Backends[官翻]
  19. faster rcn固定输入图片尺寸(一)
  20. 超详细的Asp.net使用SSL双向认证,一篇就够了

热门文章

  1. mysql密码攻击_MYSQL用户root密码为弱口令又一攻击方法
  2. sublime安装与使用
  3. TabTopUnderLineLayout【自定义顶部选项卡(带下划线)】
  4. Android零基础入门第26节:layout_gravity和gravity大不同
  5. salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)...
  6. ES5中的有9个Array方法
  7. linux 0.11 源码学习(二)
  8. ACM MM2021 | 腾讯优图实验室9篇论文入选,含弱监督图像描述及定位、表格结构识别等研究方向...
  9. 人脸检测,微软提出用RNN代替CNN
  10. MIT“35岁以下科技创新35人”榜单揭晓