一蓑烟雨任平生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 shape_predictor_68_face_landmarks.dat
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制