合格sem1是什么意思呢

合格sem1是什么意思呢,第1张

合格的一号搜索引擎营销。SEM是SearchEngineMarketing的缩写,中文意思是搜索引擎营销。SEM是一种新的网络营销形式。SEM所做的就是全面而有效的利用搜索引擎来进行网络营销和推广。SEM追求最高的性价比,以最小的投入,获最大的来自搜索引擎的访问量,并产生商业价值。

安全性评估。

sem1是护肤品安全性评估的简称,是指对护肤品的安全性进行评估,包括产品成分、功能、使用安全性、质量等等。

该评估项目是由美国美容协会(AIM)设立的,是一个严格的安全性评估系统,旨在确保护肤品的安全性和质量。

哲学家就餐问题是一种典型的同步问题,它是由Dijkstra 提出并解决的。该问题描述

:有五个哲学家,他们的生活方式是交替的进行思考和进餐。哲学家们共用一张圆桌,

查看图片

设五个哲学家分别编号为A,B,C,D,E,桌子上放着五把筷子,筷子分别编号为 0,1,

2,3,4,桌子中央有一盘饭菜。五个哲学家都很有礼貌,都要等同时拿到身旁的两只筷子

才进餐,不然就只是等着继续思考,而且吃了一口之后又马上放下拿起的两根筷子,继续思

考。

用P V原语的方式实现

每个哲学家可用一个线程来模拟,信号量及其P、V操作的实现

定义一个semaphore 类 封装 P V原语模拟函数

(不妨设有6个哲学家,6只筷子, 每只筷子各对应一个信号量且每个信号量初始值应为1)/***********************semaphore.h*****************************

Semaphore类用于模拟信号量

用法如:Semaphore sem(1)

(1)要求初始信号量值非负

(2)信号量P操作: sem.P()

(3)信号量V操作: sem.V()

#ifndef SEMAPHORE_H

#define SEMAPHORE_H

#include <windows.h>

class Semaphore{

protected:

HANDLE sem

public:

//Semaphore()

//void SetValve(int SemValue)

Semaphore(unsigned int SemValue)

virtual ~Semaphore()

void P()

void V()

#endif

/*****************************semaphore.cpp************************************/

#include <windows.h>

#include <LIMITS.H>

#include <assert.h>

#include "semaphore.h"

Semaphore::Semaphore(unsigned int semValue){

if(semValue >LONG_MAX)

semValue = LONG_MAX

sem = CreateSemaphore(NULL,semValue,LONG_MAX,NULL)

Semaphore::~Semaphore(){

CloseHandle(sem)

void Semaphore::P(){

DWORD dw = WaitForSingleObject(sem, INFINITE)

assert(dw == WAIT_OBJECT_0)

void Semaphore::V(){

ReleaseSemaphore(sem,1,NULL)

/*****************************thread.h*************************************

通过startThread开启线程

startThread(PTHREAD_START func,void * param)

用法:

//定义一个PTHREAD_START类型的函数func

unsigned int WINAPI func (void * param){

//启动一个线程使其执行func函数

startThread(func,NULL)

#ifndef THREAD_H

#define THREAD_H

#include <windows.h>

#include <process.h>

from MSDN :

Start address of a routine that begins execution of a new thread.

For _beginthread, the calling convention is either __cdecl or __clrcall

for _beginthreadex, it is either __stdcall or __clrcall.

WINAPI即为__stdcall

typedef unsigned int (WINAPI *PTHREAD_START) (void *)

chBEGINTHREADEX is From <Windows Via C &C++>

#define chBEGINTHREADEX(psa, cbStackSize, pfnStartAddr, \

pvParam, dwCreateFlags, pdwThreadId) \

((HANDLE)_beginthreadex( \

(void *)(psa), \

(unsigned) (cbStackSize), \

(PTHREAD_START) (pfnStartAddr),\

(void *)(pvParam), \

(unsigned) (dwCreateFlags), \

(unsigned *)(pdwThreadId)))

// rename chBEGINTHREADEX to startThread for simplicity

#define startThread(pfnStartAddr,pvParam)\

chBEGINTHREADEX(NULL, 0, (pfnStartAddr),(pvParam), 0, NULL)

#endif

/*****************************main函数(主函数)************************************/

假设偶数号哲学家先拿左边的筷子,右边的哲学家先拿起右边的筷子。

#include <windows.h>

#include "semaphore.h"

#include "thread.h"

#include <iostream.h>

#include <stdio.h>

#define N 6//哲学家的个数

#define LEFT(i)(i+N-1)%N//左边的筷子

#define RIGHT(i) (i==N-1)?0:(i+N)%N //右边的筷子 编号为N的哲学家的右边的筷子编号为0

/*******************************初始化信号量**************************************/

Semaphore ChopStick[N]={Semaphore(1),Semaphore(1),Semaphore(1),Semaphore(1),Semaphore(1),Semaphore(1)}

/*******************************哲学家状态*******************************************/

void Eating(int Ph_Id)

printf("Philosopher%d: \tI'm eating......\t",(int)Ph_Id)

void Sleeping(int Ph_Id)

printf("Philosopher%d:\tI'm sleeping......\t",(int)Ph_Id)

Sleep(rand()%10000)

void Thinking(int Ph_Id)

printf("Philosopher%d: \tI'm thinking......\t",(int)Ph_Id)

if (pid%2 == 0) //偶数号哲学家

Thinking(pid) //等待中

ChopStick[LEFT(pid)].P() //先拿起左边的筷子,再拿起右边的筷子

ChopStick[RIGHT(pid)].P()

Eating(pid) //获得的两个信号量则eating

ChopStick[LEFT(pid)].V() //先后释放左右信号量

ChopStick[RIGHT(pid)].V()

printf("\n")

else if(pid%2==1 ) //奇数号哲学家

Thinking(pid)

ChopStick[RIGHT(pid)].P() //先拿起右边的筷子,再拿起左边的筷子

ChopStick[LEFT(pid)].P()

Eating(pid) //左右都得到筷子后则eating

ChopStick[RIGHT(pid)].V() //先后释放右左信号量

ChopStick[LEFT(pid)].V()

printf("\n")

Sleeping(pid) //吃完睡上一会儿

int main(){

HANDLE hPhilosopher[N] //为每个哲学家分配一个线程

int count =0

for (int Philosopher_id =0 Philosopher_id<NPhilosopher_id++) //开启线程

hPhilosopher[Philosopher_id] = startThread(Philosopher,Philosopher_id)

if(count>5)

break

::WaitForMultipleObjects(N,hPhilosopher,TRUE,INFINITE)

for (Philosopher_id = 0 Philosopher_id<NPhilosopher_id++)

CloseHandle(hPhilosopher[Philosopher_id])


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/449720.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-01
下一篇2023-06-01

发表评论

登录后才能评论

评论列表(0条)

    保存