当前位置:  技术问答>linux和unix

如何不用sleep实现线程同步?

    来源: 互联网  发布时间:2016-12-14

    本文导语:  不使用sleep的话,pthread_cond_wait(&transformed, &lock)还未执行,transform信号就先发出了,就没有用了 如何不用sleep,尽量不用pause,使pthread_cond_wait(&transformed, &lock)执行? #include  #include  #include  #include  #include  #include  ...

不使用sleep的话,pthread_cond_wait(&transformed, &lock)还未执行,transform信号就先发出了,就没有用了
如何不用sleep,尽量不用pause,使pthread_cond_wait(&transformed, &lock)执行?

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


void *sender(void *);
void *receiver(void *);

char msg[60];
int tfed;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t inputed = PTHREAD_COND_INITIALIZER;
pthread_cond_t transformed = PTHREAD_COND_INITIALIZER;

int
main(int argc, char **argv) {
int err;
void *sent;
pthread_t sthd, rthd;

err = pthread_create(&rthd, NULL, receiver, NULL);
err = pthread_create(&sthd, NULL, sender, NULL);
if (err != 0) {
    fprintf(stderr, "can't create sender thread: %sn", strerror(err));
    exit(1);
}
pthread_join(sthd, &sent);
pthread_join(rthd, &sent);
pthread_mutex_destroy(&lock);
pthread_cond_destroy(&inputed);
pthread_cond_destroy(&transformed);
printf("Sent Messsages %dn", (int)sent);
}


void *sender(void *arg){
FILE *fp;
  char line[132], output[132];
  int sent_msg=0, sender_pid;
  
while (1) {
    pthread_mutex_lock(&lock);
    fgets(msg, sizeof(msg), stdin);
    pthread_mutex_unlock(&lock);
    pthread_cond_signal(&inputed);
    
    sent_msg++; 
   if (strcmp(line, "endn") == 0)
      break;
      
    pthread_mutex_lock(&lock);
    pthread_cond_wait(&transformed, &lock);
    printf("Output msg:%sn", msg);
    pthread_mutex_unlock(&lock);
  }
pthread_exit((void *)sent_msg); 
}

void *receiver(void *arg){
FILE *fp;
  char line[132], output[132];
  int sent_msg=0, i;

while(1){
    pthread_mutex_lock(&lock);
    pthread_cond_wait(&inputed, &lock);
    strcpy(line, msg);
    
    if (strcmp(msg, "endn") == 0)
      break;
              
  for(i=0;i

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 简单小代码:不用计算、不用位操作来实现 加 1
  • 不用定时刷新的方法,如何强行刷新网页?用命令实现。
  • 如何编程实现(不用shell命令)修改文件的时间
  • shell不用awk实现列求和
  • 聊天室只用javabean 不用jdbc连数据库能实现吗?
  • vmware能实现不用交换机就在本机中交互吗?
  • 在Java中,如何实现进程间通信,不用RMI
  • 请问linux下不用系统自身telnet,怎么编程实现telnet,仅限c/c++
  • jbuilder7.0的可执行文件真的不用jdk来实现吗?
  • C#实现登录窗口(不用隐藏)
  • 我用su - 用户 怎样才能实现把密码写在一行,而不用提示输入密码?
  • 使用CSS不用程序实现文字自动截断 用省略号代替
  • 不用javascript实现带序号的表格隔行换色的效果
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • 不用float实现模块居中布局
  • php+mysql不用递归实现的无限级分类实例(非递归)
  • 不用float实现div模块居中布局
  • 工作中常用的mysql语句分享 不用php也可以实现的效果
  • oracle sql 去重复记录不用distinct如何实现
  • C语言 解决不用+、-、×、÷数字运算符做加法的实现方法
  • 在linux下,如何获取屏幕分辨率(注:不用QT,也不用gtk/gdk)
  • 如果不用jbuilder中的JDK而用自己安装的?
  • 企业不用开源产品的原因??
  • 怎么使redhat8.1的刷新率改了之后不用注消或者重起啊?
  • 请问各位大虾,不用javaMail如何才能发送附件。
  • jb里面不用布局管理器可以吗?
  • STATIC变量不用赋初值?
  • ??我想不用submit提交一个网面??
  • 为什么SkinUtils这个类不用实例和初始化?
  • SCOUNIX启动时如何默认登录(不用在BOOT提示符下回车)
  • 不用JDBC-ODBC连接oracle数据库?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3