semaphore.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <semaphore.h>
#include <pthread.h>
#include <unistd.h>
sem_t sem;
#ifdef MUTI_THREAD
void *change_resource(void *res)
{
char *msg = (char *)res;
printf("change_resource execute\r\n");
while(1)
{
sem_wait(&sem);
strcat(msg, "a");
printf("resource changed with value: %s\r\n", msg);
}
}
#endif
#ifdef SEM_POST
void do_sem_post(sem_t *p_sem)
{
printf("do_sem_post execute\r\n");
while(1)
{
sem_post(p_sem);
sleep(2);
}
}
#endif
int main(int argc, char *argv[])
{
int ret = 0, val = 0, i;
pthread_t thread;
char resource[200] = {0};
printf("argc is %d\r\n", argc);
for (i = 0; i < argc; i++)
{
printf("argc[%d] is %s\r\n", i, argv[i]);
}
ret = sem_init(&sem, 0, 0);
if (ret != 0)
{
printf("sem_init failed\r\n");
return ret;
}
ret = sem_getvalue(&sem, &val);
if (ret != 0)
{
printf("sem_getvalue failed\r\n");
return ret;
}
printf("sem val is %d\r\n", val);
ret = pthread_create(&thread, NULL, change_resource, (void *)resource);
if (ret != 0)
{
printf("pthread_create failed\r\n");
return ret;
}
else
{
printf("pthread_create success\r\n");
}
do_sem_post(&sem);
ret = sem_destroy(&sem);
if (ret != 0)
{
printf("sem_destroy failed\r\n");
}
return 0;
}
注意
(1) 子线程调用的接口函数必须是这样的格式:void *change_resource(void *)
(2) pthread_create的第一个参数要定义变量再传入地址,不可直接定义指针
makefile
ROOT:=/repo/ezheson/test_dm/semaphore
FLAG=-lpthread
OBJECTS=$(ROOT)/build/semaphore.o
DEFINES=-D MUTI_THREAD \
-D SEM_POST
$(ROOT)/build/semaphore:$(OBJECTS)
$(CC) $(FLAG) $^ -o $@
$(OBJECTS):$(ROOT)/build/%.o:$(ROOT)/%.c
$(CC) $(DEFINES) -c $< -o $@
.PHONY:clean
clean:
cd ./build; rm -rf *
注意
(1) 使用sem_时,编译时要使用库-lpthread, 在连接时使用
(2) 使用-D定义宏,在编译时使用
运行结果: