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語言只是一個實現該功能的程序而已。