一蓑烟雨任平生55555 2017-06-02 14:56 采纳率: 50%
浏览 1087
已结题

使用互斥信号量,两个线程分别向同一份文件中有序地写入A和B,希望结果为BABABABA...,我这样为什么不对

设置了两个互斥信号量mutex1和mutex2,分别初始化为1。线程1等待mutex2信号量(即等待线程2将其唤醒),然后往文件中写入A,接着把刚写进去的字符发送到服务器端,操作完成以后唤醒线程2。线程2等待mutex1信号量(即等待线程1将其唤醒),然后往文件中写入B,接着把刚写进去的字符发送到服务器端,操作完成以后唤醒线程1。听起来有毛病么?然而实际上本地的文件是BABABABAABABABBA...这种样子,也就是说有些地方出现了两个连续的A,或者两个连续的B,这是为什么呢?线程1写了A以后不是被阻塞了么?怎么能够连着写两个A的呢?
线程1

 void *pthread1(void *arg)
{   
    int sock_cli = *(int *)arg;
    char *buffer = "A";
    while(1){
        sem_wait(&mutex2);//等待线程2将其唤醒
        int fd = open(FILE_NAME, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
        if(fd == -1) {
            printf("error is %s\n", strerror(errno));
            exit(-1);
        }
        write(fd, buffer, strlen(buffer));  
        send(sock_cli, buffer, strlen(buffer),0);  
        printf("send %s\n",buffer); 
        close(fd);
        sem_post(&mutex1);//唤醒线程2
        sleep(2);
    }
    close(sock_cli);
}

线程2

 void *pthread2(void *arg)
{
    int sock_cli = *(int *)arg;
    char *buffer = "B";
    while(1){
        sem_wait(&mutex1);//等待线程1将其唤醒
        int fd = open(FILE_NAME, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
        if(fd == -1) {
            printf("error is %s\n", strerror(errno));
            exit(-1);
        }
        write(fd, buffer, strlen(buffer));  
        send(sock_cli, buffer, strlen(buffer),0); 
        printf("send %s\n",buffer);  
        close(fd);
        sem_post(&mutex2);//唤醒线程1
        sleep(2);
    }
    close(sock_cli);
}

  • 写回答

1条回答 默认 最新

  • devmiao 2017-06-02 15:59
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值