当前位置:首页 » 编程语言 » 信号量c语言实现
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

信号量c语言实现

发布时间: 2022-03-06 12:42:26

1. 如何用c语言实现P,V两个程序,使信号量只加不减或只减不加

是什么样的程序我不清楚。
不过你可以定义一个 bool变量当开关嘛, 比如p操作时为 true,v操作时为false, 这样就可以分开两个操作了

2. 求指导,谁会进程,线程,信号量的C语言编程,求详细的辅导,C语言高手进!!!

只会linux下的,最好的就是用socket编程,可以将模块或进程分布在不同的机器上

3. 用C语言实现PV操作生产者消费者关系

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

typedef HANDLE Semaphore; // 信号量的Windows原型
#define P(S) WaitForSingleObject(S, INFINITE) // 定义Windows下的P操作
#define V(S) ReleaseSemaphore(S, 1, NULL) // 定义Windows下的V操作

#define rate 1000

#define CONSUMER_NUM 10 /* 消费者个数 */
#define PRODUCER_NUM 10 /* 生产者个数 */
#define BUFFER_NUM 4 /* 缓冲区个数 */

char *thing[10] = ;

struct Buffer
{
int proct[BUFFER_NUM]; // 缓冲区
int start, end; // 两个指针
} g_buf;

Semaphore g_semBuffer, g_semProct, g_mutex;

// 消费者线程
DWORD WINAPI Consumer(LPVOID para)
{
// i表示第i个消费者
int i = *(int *)para;
int ptr; // 待消费的内容的指针

printf(" 猪头-%03d: 猪头我来啦!\n", i);

Sleep(300);
while (1)
{
printf(" 猪头-%03d: 我要吃.........!\n", i);
// 等待产品
P(g_semProct);

// 有产品,先锁住缓冲区 g_buf
P(g_mutex);

// 记录消费的物品
ptr = g_buf.start;

// 再移动缓冲区指针
g_buf.start = (g_buf.start+1)%BUFFER_NUM;

// 让其他消费者或生产者使用 g_buf
V(g_mutex);

printf(" 猪头-%03d: 我吃 buf[%d] = %s\n", i, ptr, thing[g_buf.proct[ptr]]);

Sleep(rate*rand()%10+110);

// 消费完毕,并释放一个缓冲
printf(" 猪头-%03d: 我爽了! buf[%d] = %s\n", i, ptr, thing[g_buf.proct[ptr]]);
V(g_semBuffer);
}
return 0;
}

// 生产者线程
DWORD WINAPI Procer(LPVOID para)
{
int i = *(int *)para - CONSUMER_NUM;
int ptr;
int data; // 产品

printf("工作狂-%03d: 我来啦!\n", i);

Sleep(300);
while (1)
{
printf("工作狂-%03d: 我干干干…………\n", i);
Sleep(rate*rand()%10+110);

data = rand()%10;
printf("工作狂-%03d: 搞出一个东西 data = %s!\n", i, thing[data]);
// 等待存放空间
P(g_semBuffer);

// 有地方,先锁住缓冲区 g_buf
P(g_mutex);

// 记录消费的物品
ptr = g_buf.end;

// 再移动缓冲区指针
g_buf.end = (g_buf.end+1)%BUFFER_NUM;

// 让其他消费者或生产者使用 g_buf
V(g_mutex);

printf("工作狂-%03d: 搁到 buf[%d] = %s\n", i, ptr, thing[data]);
g_buf.proct[ptr] = data;

Sleep(rate/2*rand()%10+110);

// 放好了完毕,释放一个产品
printf("工作狂-%03d: buf[%d] = %s 放好了,大家吃!\n", i, ptr, thing[g_buf.proct[ptr]]);
V(g_semProct);
}
return 0;
}

int main(int argc, char *argv[])
{
// 线程技术,前面为消费者线程,后面为生产者线程
HANDLE hThread[CONSUMER_NUM+PRODUCER_NUM]; // 线程计数

//srand(time());
DWORD tid;
int i=0;

// 初始化信号量
g_mutex = CreateSemaphore(NULL, BUFFER_NUM, BUFFER_NUM, "mutexOfConsumerAndProcer");
g_semBuffer = CreateSemaphore(NULL, BUFFER_NUM, BUFFER_NUM, "BufferSemaphone");
g_semProct = CreateSemaphore(NULL, 0, BUFFER_NUM, "ProctSemaphone");

if ( !g_semBuffer || !g_semProct || !g_mutex)
{
printf("Create Semaphone Error!\n");
return -1;
}

int totalThreads = CONSUMER_NUM+PRODUCER_NUM;
// 开启消费者线程
printf("先请猪头们上席!\n");
for (i=0; i<CONSUMER_NUM; i++)
{
hThread[i] = CreateThread(NULL, 0, Consumer, &i, 0, &tid);
if ( hThread[i] ) WaitForSingleObject(hThread[i], 10);
}

printf("厨子们就位!\n");
for (; i<totalThreads; i++)
{
hThread[i] = CreateThread(NULL, 0, Procer, &i, 0, &tid);
if ( hThread[i] ) WaitForSingleObject(hThread[i], 10);
}

// 生产者和消费者的执行
WaitForMultipleObjects(totalThreads, hThread, TRUE, INFINITE);
return 0;
}

4. C语言编写生产消费者问题(Linux下用信号量)各位大神,急求呀~~~~~~

多长时间是你自己定的啊。如果生产时间和消费时间相等那么里面一直是空的,60/0.1不就是生产了多少个嘛。但是实际上他们一般都是不相等的。

5. 用C语言编程实现用信号量实现读者--写者问题(要源代码)

汗 竟然是校友...
by monkeyking

6. 操作系统里面的pv原语 信号量能用c语言实现吗还是只是伪码思想

linux 库里都有了, 他都给你封装好了 , 用就行, 都是C 语言写的 一些进程间通信,临界资源使用的函数 具体忘了 , 网上一搜能搜到

7. 信号量实现如下程序

#include <stdio.h>
#include <stdlib.h>
#include <prhtread.h>
#include <semaphore.h>
sem_t sem;
void* task(void* p){
sem_wait(&sem);
sleep(1);
sem_post(&sem);
}
int main(){
sem_init(&sem,0,1);
pthread_t id;
int i;
for(i=0;i<10;i++){
phtread_create(&id,0,task,0);
}
sem_destroy(&sem);
}

框架给你,也许,需要你自己填充你需要的内容了。

8. C语言 信号量的疑惑。。

一个是Posix实现,一个是System V实现
使用的环境不一样
一般来讲SV的适用于进程同步,POSIX适用于线程同步
System V进程同步 api:semget/semop/semctl
POSIX 线程同步 api:sem_init/sem_destroy
不过POSIX貌似还会分为有名和无名信号量上面说的是无名信号量。
具体的还要看使用的环境。

9. c语言如何用信号量实现读者写者问题,用wait和signal

网络“最全面的linux信号量解析”。

10. c语言,做出pv操作

给你提供一个思路:参考操作系统课程的教材,分别单独编写 P、V 操作,设置一个信号量 sem,用于控制可用资源数目。这道题主要考的是操作系统的 P、V 操作的概念问题,C语言只是一个实现该功能的程序而已。