Linux?μ?pv????
???????????? ???????[ 2012/8/20 13:39:31 ] ????????
????????pv????????????????????????μ?????????????????????????????????????????????????к??????????????????????win32???????????????????????????????????????linux??????????????????????????????顣
??????1??linux??????????????????
????a??????????? sem_init
????b?????????? sem_wait
????c?????????? sem_pos
????d?????????? sem_destroy
??????2????дpv????????
?????????дpv???????????п??????????????????????????Щ??????????????????Щ???????????pv????????????????е???????????????????????????????????????????????????????ν??д???????????????????????????????????shell??????gcc sem.c -g -o sem -lpthread???ɡ?
?????????????????????????????к?pv???????????????????????????pv??????????????????????????????????????????????????????????????????鷳???
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
struct MSG
{
sem_t s_empty;
sem_t s_full;
sem_t s_msg;
int* p_buffer;
int start;
int end;
int count;
};
#define STATUS int
#define TRUE 1
#define FALSE 0
static struct MSG* p_msg = NULL;
struct MSG* alloc_msg(int count)
{
struct MSG* p_msg;
p_msg = (struct MSG*) malloc(sizeof(struct MSG));
if(NULL == p_msg)
{
goto error1;
}
memset(p_msg?? 0?? sizeof(struct MSG));
p_msg->count = count;
p_msg->p_buffer = (int*)malloc(sizeof(int)* count);
if(NULL == p_msg->p_buffer)
{
goto error2;
}
sem_init(&p_msg->s_empty?? 0?? count);
sem_init(&p_msg->s_full?? 0?? 0);
sem_init(&p_msg->s_msg?? 0?? 1);
return p_msg;
error2:
free(p_msg);
error1:
return;
}
void del_msg(struct MSG* p_msg)
{
if(p_msg)
{
if(p_msg->p_buffer)
{
free(p_msg->p_buffer);
}
sem_destroy(&p_msg->s_msg);
sem_destroy(&p_msg->s_full);
sem_destroy(&p_msg->s_empty);
free(p_msg);
}
}
STATUS put_msg(struct MSG* p_msg?? int data)
{
if(NULL == p_msg )
{
return FALSE;
}
sem_wait(&p_msg->s_empty);
sem_wait(&p_msg->s_msg);
p_msg->p_buffer[p_msg->start] = data;
p_msg->start = (p_msg->start + 1) % p_msg->count;
sem_post(&p_msg->s_msg);
sem_post(&p_msg->s_full);
return TRUE;
}
STATUS get_msg(struct MSG* p_msg?? int* p_buf)
{
if(NULL == p_msg || NULL == p_buf)
{
return FALSE;
}
sem_wait(&p_msg->s_full);
sem_wait(&p_msg->s_msg);
p_buf[0] = p_msg->p_buffer[p_msg->end];
p_msg->end = (p_msg->end + 1)% p_msg->count;
sem_post(&p_msg->s_msg);
sem_post(&p_msg->s_empty);
return TRUE;
}
void* set_func(void* args)
{
int index = 100;
while(1)
{
put_msg(p_msg?? index);
printf("set %d
"?? index);
index ++; sleep(1);
}
return NULL;
}
void* get_func(void* args)
{
int data;
while(1)
{
get_msg(p_msg?? &data);
printf("get %d
"?? data);
sleep(1);
}
return NULL;
}
int main(int argc?? char* argv[])
{
pthread_t pid1?? pid2;
int index;
p_msg = alloc_msg(10);
if(NULL == p_msg)
{
goto end;
}
if(pthread_create(&pid1?? NULL?? set_func?? NULL))
{
goto end;
}
if(pthread_create(&pid2?? NULL?? get_func?? NULL))
{
goto end;
}
while(1)
{
sleep(0);
}
end:
return 1;
}
??????
???·???
??????????????????
2023/3/23 14:23:39???д?ò??????????
2023/3/22 16:17:39????????????????????Щ??
2022/6/14 16:14:27??????????????????????????
2021/10/18 15:37:44???????????????
2021/9/17 15:19:29???·???????·
2021/9/14 15:42:25?????????????
2021/5/28 17:25:47??????APP??????????
2021/5/8 17:01:11