#include
#include
#include
#include
#include
#include
#define THREAD_NUM 25
typedef struct
{undefined
FILE *_fp
int _nThreadId//第几个线程
sem_t *_semLock
}IDD_THREAD_PARAM
void *ThreadFunc(void *args)
{undefined
char sLine[100+1]
FILE *fpRead = ((IDD_THREAD_PARAM *)args)->_fp
sem_t *semLock = ((IDD_THREAD_PARAM *)args)->_semLock
int nId = ((IDD_THREAD_PARAM *)args)->_nThreadId
sem_wait(semLock)
while(!feof(fpRead))
{undefined
memset(sLine,0,sizeof(sLine))
fgets(sLine,100,fpRead)
fprintf(stderr,"Thread ID-%d:%s",nId,sLine)
}
sem_post(semLock)
}
int main()
{undefined
pthread_t *pThreads
sem_t semLock
pThreads = (pthread_t *)malloc(THREAD_NUM*sizeof(pthread_t))
sem_init(&semLock,0,1)
FILE *fp = fopen("test.txt","r")
//开始线程循环
IDD_THREAD_PARAM param
for(int i=0i
{undefined
memset(param,0,sizeof(IDD_THREAD_PARAM))
param._fp = fp
param._nThreadId = i
param._semLock = &semLock
pthread_create((pThreads+i),NULL,ThreadFunc,param)
}
for(int i=0i
pthread_join(*(pThreads+i),NULL)
free(pThreads)
pThreads = NULL
fclose(fp)
fp = NULL
return 0
}
实现一个队列CQueue CQueue提供两个公有成员函数 addTail():往队列尾部增加一个元素 removeHead():读出并移除队列的第一个元素 生产者:两个线程通过调用CQueue::addTail()往队列中增加元素 消费者:一个线程通过调用CQueue::removeHead()从队列中读取元素 #include <iostream> #include <list> #include <windows.h> #include <process.h> using namespace std #define P(sem) WaitForSingleObject(sem,INFINITE) #define V(sem) ReleaseSemaphore(sem,1,NULL) class CQueue { public: void addTail()//往队列尾部增加一个元素 void removeHead()//读出并移除队列的第一个元素 private: list<int>L } CQueue buffer//全局的缓冲区 const int buf_size = 10//缓冲区大小 static int GOODS_ID = 0//商品序号 const int producers = 3//生产者数量 const int consumers = 8//消费者数量 void ProducerThread(void* param) void ConsumerThread(void* param) HANDLE empty,occupy,op_mutex int main() { int i int p_id[producers],c_id[consumers]下面是我本学期做过的一个课程设计你可以参考一下,应该差不多
一、如何建立线程
用到的头文件
(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>
#include<string.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){} //循环等待
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)