让 线程 阻塞-->执行 怎么再从 执行-->阻塞 !!

wine2015 2010-02-02 08:38:57
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//初始化互斥锁

pthread_cond_t cond =PTHREAD_COND_INITIALIZER;//初始化条件变量



void func_pthread1(void)
{
pthread_mutex_lock(&mutex);//加锁
pthread_cond_wait(&cond,&mutex);// 设置条件变量,等待SIGNAL
while(1)
{
;
}
sleep(1);
pthread_mutex_unlock(&mutex);//解锁
pthread_exit(0);
}

void func_pthread2(void)
{
sleep(1);
pthread_mutex_lock(&mutex);//加锁
printf("hello\r\n");
pthread_mutex_unlock(&mutex);//解锁
pthread_cond_signal(&cond);发送SIGNAL
pthread_exit(0);
}

int main()

{
pthread_t pthread1,pthread2;

pthread_create(&pthread1,NULL,(void *)func_pthread1,NULL);//创建线程pthread1
pthread_create(&pthread2,NULL,(void *)func_pthread2,NULL);//创建线程pthread2
pthread_join(pthread1,NULL);
pthread_join(pthread2,NULL);
}

控制func_pthread1 执行和阻塞
...全文
477 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
独孤过儿 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yutaooo 的回复:]
过儿:
在#17楼的代码不对的吧。pthread_cond_wait之前是要将mutex加锁上的。
[/Quote]
这个不一定,cond前加不加mutex要看实际的场景,如果两个线程存在的临界资源的情况,那就需要加,而

楼主这个例子,两个线程间并不存在任何临界资源的问题,只是一个信号的发送和响应问题,所以不需要加

我可以举一个需要加mutex的例子。假如在读者写者问题中,读者和写者共享一个缓冲区,当写者向缓冲区

里写数据的时候,就先需要用mutex把缓冲区锁上,如果恰好这时候缓冲区满了,那写者就会继续cond,等

待读者读走了一条数据以后,缓冲区有空间可用了,就会发一个signal唤醒写者。在这种情况下mutex就是

必要的了。

yutaooo 2010-02-03
  • 打赏
  • 举报
回复

过儿:
在#17楼的代码不对的吧。pthread_cond_wait之前是要将mutex加锁上的。

LZ:
pthread condition是保护条件。条件在哪里呀? 是不是应该设一个变量,比如bool run。再用cond去保护?
独孤过儿 2010-02-03
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//初始化互斥锁
pthread_cond_t cond =PTHREAD_COND_INITIALIZER;//初始化条件变量


void func_pthread1(void)
{
// thread1 is running
printf("Thread1 start to execute!\n");

//pthread_mutex_lock(&mutex);//加锁

// wait a condition here, thread will be blocked
printf("Thread1 will be blocked and wait the signal\n");
pthread_cond_wait(&cond,&mutex);// 设置条件变量,等待SIGNAL
while(1)
{
printf("Thread1 have received the signal\n");
printf("Thread1 will be blocked and wait the signal\n");
pthread_cond_wait(&cond,&mutex);// 设置条件变量,等待SIGNAL
}
//sleep(1);
//pthread_mutex_unlock(&mutex);//解锁
pthread_exit(0);
}

void func_pthread2(void)
{
int i = 0;
sleep(1);
//pthread_mutex_lock(&mutex);//加锁
printf("hello, thread2 start to execute\n");
//pthread_mutex_unlock(&mutex);//解锁
while (i++ < 3)
{
printf("Thread2 send a signal to thread1\n");
pthread_cond_signal(&cond); //发送SIGNAL
sleep(3);
}
}

int main()

{
pthread_t pthread1,pthread2;

pthread_create(&pthread1,NULL,(void *)func_pthread1,NULL);//创建线程pthread1
pthread_create(&pthread2,NULL,(void *)func_pthread2,NULL);//创建线程pthread2
pthread_join(pthread1,NULL);
pthread_join(pthread2,NULL);
}

thread2每隔三秒钟,给thread1发送一个信号,唤醒thread1,一共发三次。

thread1开始执行了以后,就会等待signal的到来,收到一个signal,就会打印一条信息,然后继续阻塞,等待下一个signal的到来
wine2015 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 macrojj 的回复:]
让它再去等待信号 不就阻塞了。
[/Quote]

不行。我试了, 没成。怎么让一个运行起来的线程阻塞。
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 saksak 的回复:]
引用 9 楼 saksak 的回复:
我需要一个模型,在 LINUX C 下。实现线程间的控制,执行,阻塞,再执行。。。。。不知道如何实现。正在尝试。


可否提供相关资料。没代码不好懂
[/Quote]

Unix 环境高级编程,你既然用linux下的c编程,就应该看看。

macrojj 2010-02-03
  • 打赏
  • 举报
回复
让它再去等待信号 不就阻塞了。
wolffan3150 2010-02-03
  • 打赏
  • 举报
回复
void func_pthread1(void)
{
pthread_mutex_lock(&mutex);//加锁

while(1)
{
pthread_cond_wait(&cond,&mutex);// 设置条件变量,等待SIGNAL ;
}
sleep(1);
pthread_mutex_unlock(&mutex);//解锁
pthread_exit(0);
}
wine2015 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 saksak 的回复:]
我需要一个模型,在 LINUX C 下。实现线程间的控制,执行,阻塞,再执行。。。。。不知道如何实现。正在尝试。
[/Quote]

可否提供相关资料。没代码不好懂
wine2015 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 saksak 的回复:]
引用 5 楼 taodm 的回复:
楼主听说过消息驱动、线程消息队列没有?


都没用过,可否指点。
[/Quote]

可是再怎么让第一个线程回到阻塞状态呢。
shellfish567 2010-02-03
  • 打赏
  • 举报
回复
临界区不错,轻型的线程同步
wine2015 2010-02-03
  • 打赏
  • 举报
回复
我需要一个模型,在 LINUX C 下。实现线程间的控制,执行,阻塞,再执行。。。。。不知道如何实现。正在尝试。
bobo364 2010-02-03
  • 打赏
  • 举报
回复
这是c++的吧,但也学习了
独孤过儿 2010-02-03
  • 打赏
  • 举报
回复
1、第一个线程在创建以后,就是running的状态了,你可以试着在线程函数内首先打印一条创建成功的消息,就能证明它是running的了。

2、既然他是running的了,那接下来就不需要用mutex锁了,只需要直接等待cond就可以。因为这个时候并没有收到signal,所以线程1就会自动进入阻塞状态了

3、线程2开始执行了以后,首先是running状态。当执行sleep()的时候就会将线程转成可中断状态,一秒过后,线程继续执行,这个时候也没有必要再mutex,直接发signal给线程1,唤醒它继续执行

这样就能满足你的模型了
wine2015 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 taodm 的回复:]
楼主听说过消息驱动、线程消息队列没有?
[/Quote]

都没用过,可否指点。
taodm 2010-02-03
  • 打赏
  • 举报
回复
楼主听说过消息驱动、线程消息队列没有?
shellfish567 2010-02-03
  • 打赏
  • 举报
回复
晕,看你这锁锁的……吓人了,互斥锁是针对需要访问和修改的共享资源进行的锁,而不是整个加锁,你这个根本没任何意义了
mostmark 2010-02-03
  • 打赏
  • 举报
回复
????
bladesoft 2010-02-03
  • 打赏
  • 举报
回复
Linux编程上一般都有这个例子,多看看就懂了
yutaooo 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 saksak 的回复:]
我的第一个线程里要放一个无限循环的函数。不能在下一次信号来之前阻塞。这个是难点。谁有好办法呀。
[/Quote]

一个想法就是用signal。

hlyces 2010-02-03
  • 打赏
  • 举报
回复
.00.0
加载更多回复(6)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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