當前位置:首頁 » 編程語言 » 信號量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語言只是一個實現該功能的程序而已。