线程 读写-各位大侠,小弟练习写了个代码,求解答

问题描述

各位大侠,小弟练习写了个代码,求解答

为什么运行的结果不能输出“>”,而且当我在终端输入quit时 出现不停打印“>”的死循环
代码如下:

#include
#include
#include
#include
#include
#include
#include
#include

#define MAX 1024
pthread_mutex_t rwlock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t rwcond =PTHREAD_COND_INITIALIZER;
void* read_file(void *arg)
{
int fd;
int ret,n;
char buf[MAX];
if(fd = open ((char *)arg ,O_CREAT|O_RDONLY,0666) == -1)
{
perror("open fail");
pthread_exit(NULL);
}
while(1){
ret =pthread_mutex_lock(&rwlock);
if (ret != 0)
{
perror("pthread_mutex_lock");
close(fd);
pthread_exit(NULL);
}
n = read(fd ,buf,sizeof(buf));
if(n< 0)
{
perror("read fail");
close(fd);
pthread_exit(NULL);
}
while(n == 0)
{
ret = pthread_cond_wait(&rwcond,&rwlock);
if(ret != 0)
{
perror("pthread_cond_wait fail");
close(fd);
pthread_exit(NULL);
}

    }
    buf[n] ='';
    printf("read %d character :%s n",strlen(buf),buf);
    if(strncmp(buf,"quit",4) == 0)
    {
        ret =pthread_mutex_unlock(&rwlock);
        if(ret !=0)
        {
            perror("pthread_mutex_unlock fail");
            close(fd);
            pthread_exit(NULL);
        }
        break;
    }
    ret = pthread_mutex_unlock(&rwlock);
    if(ret != 0)
    {
        perror("pthread_mutex_unlock fail");
        close(fd);
        pthread_exit(NULL);
    }

}
close(fd);
pthread_exit(NULL);

}
void* write_file(void arg)
{
int fd;
int ret,n;
char buf[MAX];
char buf_bak[MAX];
fd = open((char
)arg,O_CREAT|O_TRUNC|O_WRONLY,0666);
if(fd < 0)
{
perror("open fail");
pthread_exit(NULL);
}
while(1){
ret = pthread_mutex_lock(&rwlock);
if(ret != 0)
{
perror("pthread_mutex_lock fail");
close(fd);
pthread_exit(NULL);
}
printf(">n");
fgets(buf,strlen(buf),stdin);
//snprintf(buf_bak,sizeof(buf_bak),"%s",buf);
buf[strlen(buf)-1] ='';
n = write(fd,buf,sizeof(buf));
if(n < 0)
{
perror("write fail");
close(fd);
pthread_exit(NULL);
}
if(strncmp(buf,"quit",4) == 0)
{
ret = pthread_mutex_unlock(&rwlock);
if(ret != 0)
{
perror("pthread_mutex_unlock fail");
close(fd);
pthread_exit(NULL);
}
ret = pthread_cond_signal(&rwcond);
if(ret != 0)
{
perror("pthread_cond_signal fail");
close(fd);
pthread_exit(NULL);
}
usleep(500);
break;
}
ret = pthread_mutex_unlock(&rwlock);
if(ret != 0)
{
perror("pthread_mutex_unlock fail");
close(fd);
pthread_exit(NULL);
}
ret =pthread_cond_signal(&rwcond);
if(ret != 0)
{
perror("pthread_cond_signal fail");
close(fd);
pthread_exit(NULL);
}
usleep(500);
}
close(fd);
pthread_exit(NULL);
}

int main (int argc,char *argv[])
{
pthread_t rpth_id,wpth_id;
int ret;
if(argc < 2)
{
fprintf(stderr,"usage: %s argv[1]n",argv[0]);
exit(EXIT_FAILURE);
}
ret = pthread_create(&rpth_id,NULL,read_file,(void *)argv[1]);
if(ret != 0)
{
perror("prhread_create fail");

exit(EXIT_FAILURE);
}
usleep(500);
ret = pthread_create(&wpth_id,NULL,write_file,(void *)argv[1]);
if (ret != 0)
{
perror("pthread_create fail");
exit(EXIT_FAILURE);
}

pthread_join(rpth_id,NULL);
pthread_join(wpth_id,NULL);
return 0;

}

解决方案

看看是不是线程没有正确退出

时间: 2024-09-13 17:32:02

线程 读写-各位大侠,小弟练习写了个代码,求解答的相关文章

编程c语言-写的c代码求帮忙找错误

问题描述 写的c代码求帮忙找错误 #include #include #include #include #include extern "C" { WINBASEAPI HWND WINAPI GetConsoleWindow(); } int main(int argc, char *argv[]) //主线程运行结束,辅助线程也结束. { HWND hwnd; HDC hdc; printf("There are some words in console window

网站的前台和后台要分开两个项目写吗,新手求解答

问题描述 比如我现在要做一个电子商务的系统,这个系统有前台和后台,前台主要是商品的展示,以及用户下订单什么的.后台是商品的发布,就是增删改查等,那么我这个系统要把前台和后台分开成两个项目下吗,这两个项目操作同一个数据库.如果是分开成两个项目的话,那我在后台发布商品的时候,图片上传的是在后台这个项目的某个文件夹下面,前台又该怎么去访问到这些图片呢,而且我的前台和后台是不是要用两个不同的域名?这两个域名分别指向同一个IP地址同一个端口的两个不同的工程?新手求解答,麻烦各位大虾解决下,小弟在此谢谢了!

小弟初写jquery插件,路遇难题,请大侠们搭把手啊

问题描述 小弟初写jquery插件,路遇难题,请大侠们搭把手啊 小弟想写个图片上传插件,才写了点,但测试发现了问题.不同的元素调用插件只有一个有效果,不知咋回事啊. $(function(){ $("#t1").LAYIMGUpload({ 'inputFileName':'orgLogo' }); $("#t2").LAYIMGUpload({ 'inputFileName':'orgLogo1' }); $("#t3").LAYIMGUplo

delphi线程问题 delphi 程序里我写了一个方法

问题描述 delphi线程问题 delphi 程序里我写了一个方法 delphi 程序里我写了一个方法,方法里面的算法比较复杂,计算起来时间比较长,我想把这个方法单独放到一个线程里去执行,请问是怎么写?一点头绪没有啊,谢谢 解决方案 unit Unit1; interface uses Windows Messages SysUtils Variants Classes Graphics Controls Forms Dialogs StdCtrls; type TForm1 = class(T

多线程-小白问题,这个if判断式该写在我代码的哪里?

问题描述 小白问题,这个if判断式该写在我代码的哪里? 直接上图了神们! 解决方案 if肯定要放到for循环内:只有for循环中num值在改变. 解决方案二: [边做项目边学Android]小白会遇到的问题--This Android SDK requires Android Developer Toolkit version 23.0.0 or above 解决方案三: 你这是赋值,不是等于 解决方案四: 逻辑运算是两个封号的,所以这样写编译器就报错了. 解决方案五: 等号是负值,等等号才是比

图片-小弟初学汇编,遇到问题,,求解答

问题描述 小弟初学汇编,遇到问题,,求解答 这两个问题困惑我很久了,,,急..... 解决方案 1.SS是段寄存器,AX只是起转移赋值作用.在AX里他就是一个值,不是地址,才SS中才有地址的意义.所以得分清在不同寄存器中值和地址. 2.物理地址就是1*10H+0=10H 物理地址10H又可以写成0:[0010] 解决方案二: 要看上下文.第一题中说把ax入栈,没有说把ax原始的值入栈.可能这一点你理解有偏差. 就是把1送入段寄存器.8086CPU不支持将数据直接送入段寄存器的操作,所以要分两行

求C#写系统操作代码

问题描述 谁能告诉我,用C#怎么写关于操作系统的代码.如:系统关机之类的.新手,学习学习, 解决方案 解决方案二:启用一个进程.线程去动态控制CMD然后写上相关条件就好了解决方案三:System.Diagnostics.Process.Start("cmd.exe","shutdown-f-s-t1");//强制一秒倒计时关机!解决方案四:系统操作!=操作系统.名词(操作系统)!=动词(操作)+名词(系统)要想完成各种系统调用,学习API函数是必不可少的.

string-求大神帮小弟看看这份JAVA代码究竟哪里出问题了 如何修改

问题描述 求大神帮小弟看看这份JAVA代码究竟哪里出问题了 如何修改 public class Person { String name; public Person(String personName) { name = personName; } public String greet(String yourName) { return String.format("Hi %s, my name is %s", yourName,name); } } 解决方案 代码没有编译上的错误

线程停止-java如何停止当前正在运行的线程,新手求解答

问题描述 java如何停止当前正在运行的线程,新手求解答 最近想做一个无线数据监控服务端,用java做的,面板Jframe设置了一个Jpanel,我称这个为Jpanel 1 ,在Jpanel 1中我定义了一个多选JCheckbox,有四种监控方式可选:Bluetooth,Wifi,GPRS,Zigbee.还定义了一个JButton,分为开始ON,结束OFF,然后在JPanel 1中定义了JPanel 2,JPanel 2 中我定义了JScrollPane,scrollAndSetCursor用于