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

yechenyin 2011-07-17 03:00:23
不使用sleep的话,pthread_cond_wait(&transformed, &lock)还未执行,transform信号就先发出了,就没有用了
如何不用sleep,尽量不用pause,使pthread_cond_wait(&transformed, &lock)执行?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <signal.h>
#include <pthread.h>


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: %s\n", 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 %d\n", (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, "end\n") == 0)
break;

pthread_mutex_lock(&lock);
pthread_cond_wait(&transformed, &lock);
printf("Output msg:%s\n", 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, "end\n") == 0)
break;

for(i=0;i<strlen(line);i++)
msg[i]= toupper(line[i]);
msg[i]='\0';
strcpy(output, msg);
pthread_mutex_unlock(&lock);
//printf("Transformed msg:%s\n", output);
sent_msg++;
sleep(1);
pthread_cond_signal(&transformed);
}
pthread_exit((void *)sent_msg);
}


...全文
60 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yechenyin 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fengzhw 的回复:]

引用 2 楼 challenge99 的回复:

当消费者从生产者那里取走了货物,并使用后,生产者才能再生产

如果我没有理解错,你想表达这样的意思,那么多线程的意义何在呢?


要实现你的代码,需要增加标志,表示信号是否已经发出,比如,a 等待 b的信号

a {
pthread_mutex_lock(&amp;lock);
if (sended == 0) {
……
[/Quote]

他说没错,是if,while反而会出错
上面的高手多谢了
fengzhw 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 challenge99 的回复:]

当消费者从生产者那里取走了货物,并使用后,生产者才能再生产

如果我没有理解错,你想表达这样的意思,那么多线程的意义何在呢?


要实现你的代码,需要增加标志,表示信号是否已经发出,比如,a 等待 b的信号

a {
pthread_mutex_lock(&lock);
if (sended == 0) {
pthread_cond_wait(&sig, &……
[/Quote]

if (sended == 0) {
改成 while(sended == 0) ?
challenge99 2011-07-17
  • 打赏
  • 举报
回复
当消费者从生产者那里取走了货物,并使用后,生产者才能再生产

如果我没有理解错,你想表达这样的意思,那么多线程的意义何在呢?


要实现你的代码,需要增加标志,表示信号是否已经发出,比如,a 等待 b的信号

a {
pthread_mutex_lock(&lock);
if (sended == 0) {
pthread_cond_wait(&sig, &lock);
}
pthread_mutex_unlock(&lock);
}

b {
pthread_mutex_lock(&lock);
sended = 1;
pthread_cond_signal(&sig);
pthread_mutex_unlock(&lock);
}
昵称很不好取 2011-07-17
  • 打赏
  • 举报
回复
执行太快了就放弃cpu的时间片,sleep(0)也可以

23,114

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧