扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
下,应该差不多
十年专业网络公司历程,坚持以创新为先导的网站服务,服务超过上千多家企业及个人,涉及网站设计、APP应用开发、微信开发、平面设计、互联网整合营销等多个领域。在不同行业和领域给人们的工作和生活带来美好变化。
一、如何建立线程
用到的头文件
(a)pthread.h
(b)semaphore.h
(c) stdio.h
(d)string.h
定义线程标识
pthread_t
创建线程
pthread_create
对应了一个函数作为线程的程序段
注意的问题
要保证进程不结束(在创建线程后加死循环)
在线程中加入While(1)语句,也就是死循环,保证进程不结束。
二、控制线程并发的函数
sem_t:信号量的类型
sem_init:初始化信号量
sem_wait:相当于P操作
sem_post:相当于V操作
三、实现原形系统
父亲、母亲、儿子和女儿的题目:
桌上有一只盘子,每次只能放入一只水果。爸爸专放苹果,妈妈专放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。分别用P,V操作和管程实现
每个对应一个线程
pthread_t father; father进程
pthread_t mother; mother进程
pthread_t son; son进程
pthread_t daughter; daughter进程
盘子可以用一个变量表示
sem_t empty;
各线程不是只做一次,可以是无限或有限次循环
用While(1)控制各线程无限次循环
输出每次是那个线程执行的信息
printf("%s\n",(char *)arg);通过参数arg输出对应线程执行信息
编译方法
gcc hex.c -lpthread
生成默认的可执行文件a.out
输入./a.out命令运行
查看结果:程序连续运行显示出
father input an apple.
daughter get an apple.
mother input an orange.
son get an orange.
mother input an orange.
son get an orange.
………………..
四、程序源代码
#include stdio.h
#includestring.h
#include semaphore.h
#include pthread.h
sem_t empty; //定义信号量
sem_t applefull;
sem_t orangefull;
void *procf(void *arg) //father线程
{
while(1){
sem_wait(empty); //P操作
printf("%s\n",(char *)arg);
sem_post(applefull); //V操作
sleep(7);
}
}
void *procm(void *arg) //mother线程
{
while(1){
sem_wait(empty);
printf("%s\n",(char *)arg);
sem_post(orangefull);
sleep(3);
}
}
void *procs(void *arg) //son线程
{
while(1){
sem_wait(orangefull);
printf("%s\n",(char *)arg);
sem_post(empty);
sleep(2);
}
}
void *procd(void *arg) //daughter线程
{
while(1){
sem_wait(applefull);
printf("%s\n",(char *)arg);
sem_post(empty);
sleep(5);
}
}
main()
{
pthread_t father; //定义线程
pthread_t mother;
pthread_t son;
pthread_t daughter;
sem_init(empty, 0, 1); //信号量初始化
sem_init(applefull, 0, 0);
sem_init(orangefull, 0, 0);
pthread_create(father,NULL,procf,"father input an apple."); //创建线程
pthread_create(mother,NULL,procm,"mother input an orange.");
pthread_create(daughter,NULL,procd,"daughter get an apple.");
pthread_create(son,NULL,procs,"son get an orange.");
while(1){} //循环等待
}
另外,站长团上有产品团购,便宜有保证
你的想法对于单一进程是行不通的,因为一旦进程“阻塞”了,变量的值又怎么可能自己改变呢?
如果你谈的是多进程(或线程),那有很多方法可以使用。但恐怕你不是在进行多进程编程,因为这是多进程编程的最基本概念。如果连这些都未掌握,你根本没办法进行下去,更不用设计什么变量i变量j的了。
当然可以,定义成全局变量或者在定义的那个函数返回此队列把此返回的队列作为实参传递给另一个函数
看你提出的问题,应该自己有一部分代码了,我还是先提思路吧。 你需要一个阻塞队列,需要阻塞的进程放入阻塞队列,这个队列用单向链表即可。 然后再进程调度的间隙扫描阻塞队列,看有没有需要解除阻塞的进程,如果有将其从阻塞队列摘除,挂入就绪队列。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流