OS-POSIX MSGQUEUE. MUTEX

本文介绍了一种利用Mutex来实现消息队列的方法。通过创建三个锁:API同步锁、读同步锁及写同步锁,确保了消息队列在并发环境下的正确性和安全性。文章详细解释了各接口的功能及其实现细节。

网上找了一会儿,一时半刻找不到合适的实现SysV 消息队列的API,没办法,只好直接用Mutex 实现了一个PV操作的消息队列。


接口:

OS_MSGQ_Handle OS_MSGQ_Create(
API_IN int queueSize, // should <= MSGQ_SIZE_MAX
API_IN int dataSize // should <= MSGQ_DATASIZE_MAX
);


OS_RET OS_MSGQ_Destroy(
API_IN OS_MSGQ_Handle pHandle
);


OS_RET OS_MSGQ_Recv(
API_IN OS_MSGQ_Handle pHandle,
API_IN char *pmsg,
API_IN int size, // should <= dataSize
API_IN int wait
);


OS_RET OS_MSGQ_Send(
API_IN OS_MSGQ_Handle pHandle,
API_IN char *pmsg, int size ,
API_IN int wait
);


OS_RET OS_MSGQ_Flush(
API_IN OS_MSGQ_Handle pHandle
);


实现:

主要用了3个锁

API同步锁

读同步锁 接收的时候判断队伍是否为空,空的话挂起读同步锁

写同步锁 发送时判断队列是否满,满的话挂起写同步锁


Debug时,发现自己一直搞晕写与读,发送端对应写同步锁,接收端对应读同步锁。

写了2-3个小时才实现好。


Mutex:

接口:

OS_Mutex_Handle OS_Mutex_Create();


OS_RET OS_Mutex_Destroy(
API_IN OS_Mutex_Handle pHandle
);


OS_RET OS_Mutex_Lock(
API_IN OS_Mutex_Handle pHandle
);


OS_RET OS_Mutex_UnLock(
API_IN OS_Mutex_Handle pHandle
);


实现:

pthread_mutex_init(&mutex->mutexID, NULL);

pthread_mutex_lock(&mutex->mutexID);

pthread_mutex_unlock(&mutex->mutexID);

pthread_mutex_destroy(&mutex->mutexID);

set (NN_SOURCES nn.h inproc.h ipc.h tcp.h ws.h pair.h pubsub.h reqrep.h pipeline.h survey.h bus.h core/ep.h core/ep.c core/global.h core/global.c core/pipe.c core/poll.c core/sock.h core/sock.c core/sockbase.c core/symbol.c aio/ctx.h aio/ctx.c aio/fsm.h aio/fsm.c aio/pool.h aio/pool.c aio/timer.h aio/timer.c aio/timerset.h aio/timerset.c aio/usock.h aio/usock.c aio/worker.h aio/worker.c utils/alloc.h utils/alloc.c utils/atomic.h utils/atomic.c utils/attr.h utils/chunk.h utils/chunk.c utils/chunkref.h utils/chunkref.c utils/clock.h utils/clock.c utils/closefd.h utils/closefd.c utils/cont.h utils/efd.h utils/efd.c utils/err.h utils/err.c utils/fast.h utils/fd.h utils/hash.h utils/hash.c utils/list.h utils/list.c utils/msg.h utils/msg.c utils/condvar.h utils/condvar.c utils/mutex.h utils/mutex.c utils/once.h utils/once.c utils/queue.h utils/queue.c utils/random.h utils/random.c utils/sem.h utils/sem.c utils/sleep.h utils/sleep.c utils/strcasecmp.c utils/strcasecmp.h utils/strcasestr.c utils/strcasestr.h utils/strncasecmp.c utils/strncasecmp.h utils/thread.h utils/thread.c utils/wire.h utils/wire.c devices/device.h devices/device.c protocols/utils/dist.h protocols/utils/dist.c protocols/utils/excl.h protocols/utils/excl.c protocols/utils/fq.h protocols/utils/fq.c protocols/utils/lb.h protocols/utils/lb.c protocols/utils/priolist.h protocols/utils/priolist.c protocols/bus/bus.c protocols/bus/xbus.h protocols/bus/xbus.c protocols/pipeline/push.c protocols/pipeline/pull.c protocols/pipeline/xpull.h protocols/pipeline/xpull.c protocols/pipeline/xpush.h protocols/pipeline/xpush.c protocols/pair/pair.c protocols/pair/xpair.h protocols/pair/xpair.c protocols/pubsub/pub.c protocols/pubsub/sub.c protocols/pubsub/trie.h protocols/pubsub/trie.c protocols/pubsub/xpub.h protocols/pubsub/xpub.c protocols/pubsub/xsub.h protocols/pubsub/xsub.c protocols/reqrep/req.h protocols/reqrep/req.c protocols/reqrep/rep.h protocols/reqrep/rep.c protocols/reqrep/task.h protocols/reqrep/task.c protocols/reqrep/xrep.h protocols/reqrep/xrep.c protocols/reqrep/xreq.h protocols/reqrep/xreq.c protocols/survey/respondent.c protocols/survey/surveyor.c protocols/survey/xrespondent.h protocols/survey/xrespondent.c protocols/survey/xsurveyor.h protocols/survey/xsurveyor.c transports/utils/backoff.h transports/utils/backoff.c transports/utils/dns.h transports/utils/dns.c transports/utils/dns_getaddrinfo.h transports/utils/dns_getaddrinfo.inc transports/utils/dns_getaddrinfo_a.h transports/utils/dns_getaddrinfo_a.inc transports/utils/iface.h transports/utils/iface.c transports/utils/literal.h transports/utils/literal.c transports/utils/port.h transports/utils/port.c transports/utils/streamhdr.h transports/utils/streamhdr.c transports/utils/base64.h transports/utils/base64.c transports/inproc/binproc.h transports/inproc/binproc.c transports/inproc/cinproc.h transports/inproc/cinproc.c transports/inproc/inproc.c transports/inproc/ins.h transports/inproc/ins.c transports/inproc/msgqueue.h transports/inproc/msgqueue.c transports/inproc/sinproc.h transports/inproc/sinproc.c transports/ipc/aipc.h transports/ipc/aipc.c transports/ipc/bipc.h transports/ipc/bipc.c transports/ipc/cipc.h transports/ipc/cipc.c transports/ipc/ipc.c transports/ipc/sipc.h transports/ipc/sipc.c transports/tcp/atcp.h transports/tcp/atcp.c transports/tcp/btcp.h transports/tcp/btcp.c transports/tcp/ctcp.h transports/tcp/ctcp.c transports/tcp/stcp.h transports/tcp/stcp.c transports/tcp/tcp.c transports/ws/aws.h transports/ws/aws.c transports/ws/bws.h transports/ws/bws.c transports/ws/cws.h transports/ws/cws.c transports/ws/sws.h transports/ws/sws.c transports/ws/ws.c transports/ws/ws_handshake.h transports/ws/ws_handshake.c transports/ws/sha1.h transports/ws/sha1.c ) if (WIN32) list (APPEND NN_SOURCES aio/usock_win.h aio/usock_win.inc aio/worker_win.h aio/worker_win.inc utils/thread_win.h utils/thread_win.inc utils/win.h ) elseif (UNIX) list (APPEND NN_SOURCES aio/usock_posix.h aio/usock_posix.inc aio/worker_posix.h aio/worker_posix.inc utils/thread_posix.h utils/thread_posix.inc ) else () message (FATAL_ERROR "Assertion failed; this path is unreachable.") endif () if (NN_HAVE_EPOLL) add_definitions (-DNN_USE_EPOLL) list (APPEND NN_SOURCES aio/poller.h aio/poller.c aio/poller_epoll.h aio/poller_epoll.inc ) elseif (NN_HAVE_KQUEUE) add_definitions (-DNN_USE_KQUEUE) list (APPEND NN_SOURCES aio/poller.h aio/poller.c aio/poller_kqueue.h aio/poller_kqueue.inc ) elseif (NN_HAVE_POLL) add_definitions (-DNN_USE_POLL) list (APPEND NN_SOURCES aio/poller.h aio/poller.c aio/poller_poll.h aio/poller_poll.inc ) elseif (NN_HAVE_WINSOCK) # No operation else () message (SEND_ERROR "ERROR: could not determine socket polling method.") message (SEND_ERROR "${ISSUE_REPORT_MSG}" ) endif () if (NN_HAVE_EVENTFD) add_definitions (-DNN_USE_EVENTFD) list (APPEND NN_SOURCES utils/efd_eventfd.h utils/efd_eventfd.inc ) elseif (NN_HAVE_PIPE) add_definitions (-DNN_USE_PIPE) list (APPEND NN_SOURCES utils/efd_pipe.h utils/efd_pipe.inc ) elseif (NN_HAVE_SOCKETPAIR) add_definitions (-DNN_USE_SOCKETPAIR) list (APPEND NN_SOURCES utils/efd_socketpair.h utils/efd_socketpair.inc ) elseif (NN_HAVE_WINSOCK) add_definitions (-DNN_USE_WINSOCK) list (APPEND NN_SOURCES utils/efd_win.h utils/efd_win.inc ) else () message (SEND_ERROR "ERROR: could not determine socket signaling method.") message (SEND_ERROR "${ISSUE_REPORT_MSG}" ) endif () # Provide same folder structure in IDE as on disk foreach (f ${NN_SOURCES}) # Get the path of the file relative to source directory if (IS_ABSOLUTE "${f}") file (RELATIVE_PATH f ${CMAKE_CURRENT_SOURCE_DIR} ${f}) endif () set (SRC_GROUP "${f}") set (f "${CMAKE_CURRENT_SOURCE_DIR}/${f}") # Remove the filename part string (REGEX REPLACE "(.*)(/[^/]*)$" "\\1" SRC_GROUP ${SRC_GROUP}) # CMake source_group expects \\, not / string (REPLACE / \\ SRC_GROUP ${SRC_GROUP}) source_group ("${SRC_GROUP}" FILES ${f}) endforeach () if (NN_STATIC_LIB) add_library (${PROJECT_NAME} STATIC ${NN_SOURCES}) else () add_library (${PROJECT_NAME} SHARED ${NN_SOURCES}) add_definitions (-DNN_SHARED_LIB) set_target_properties (${PROJECT_NAME} PROPERTIES SOVERSION "${NN_ABI_VERSION}") endif () # Set library outputs same as top-level project binary outputs set_target_properties (${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) set_target_properties (${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) set_target_properties (${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) target_link_libraries (${PROJECT_NAME} ${NN_REQUIRED_LIBRARIES}) if(THREADS_HAVE_PTHREAD_ARG) add_definitions (-pthread) endif() if(CMAKE_THREAD_LIBS_INIT) target_link_libraries (${PROJECT_NAME} "${CMAKE_THREAD_LIBS_INIT}") endif() # pkg-config file if(NN_REQUIRED_LIBRARIES) foreach (lib ${NN_REQUIRED_LIBRARIES}) set (NN_REQUIRED_LFLAGS "${NN_REQUIRED_LFLAGS} -l${lib}") endforeach() endif() configure_file (pkgconfig.in ${PROJECT_NAME}.pc @ONLY) install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) install (TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} )
最新发布
09-29
make[4]: Leaving directory '/www/wwwroot/report/report2/glibc-2.36/malloc' make subdir=misc -C ../misc ..=../ objdir=/www/wwwroot/report/report2/glibc-2.36/build -f Makefile -f ../elf/rtld-Rules rtld-all rtld-modules='rtld-mmap64.os rtld-munmap.os rtld-mprotect.os rtld-single_threaded.os' make subdir=nptl -C ../nptl ..=../ objdir=/www/wwwroot/report/report2/glibc-2.36/build -f Makefile -f ../elf/rtld-Rules rtld-all rtld-modules='rtld-lowlevellock.os' make[4]: Entering directory '/www/wwwroot/report/report2/glibc-2.36/nptl' make[4]: Leaving directory '/www/wwwroot/report/report2/glibc-2.36/nptl' make subdir=posix -C ../posix ..=../ objdir=/www/wwwroot/report/report2/glibc-2.36/build -f Makefile -f ../elf/rtld-Rules rtld-all rtld-modules='rtld-uname.os rtld-_exit.os rtld-getpid.os rtld-environ.os' make[4]: Entering directory '/www/wwwroot/report/report2/glibc-2.36/posix' make[4]: Leaving directory '/www/wwwroot/report/report2/glibc-2.36/posix' make subdir=setjmp -C ../setjmp ..=../ objdir=/www/wwwroot/report/report2/glibc-2.36/build -f Makefile -f ../elf/rtld-Rules rtld-all rtld-modules='rtld-setjmp.os rtld-__longjmp.os' make subdir=signal -C ../signal ..=../ objdir=/www/wwwroot/report/report2/glibc-2.36/build -f Makefile -f ../elf/rtld-Rules rtld-all rtld-modules='rtld-sigaction.os rtld-libc_sigaction.os rtld-sigaction.os' make subdir=stdio-common -C ../stdio-common ..=../ objdir=/www/wwwroot/report/report2/glibc-2.36/build -f Makefile -f ../elf/rtld-Rules rtld-all rtld-modules='rtld-errname.os' make[4]: Entering directory '/www/wwwroot/report/report2/glibc-2.36/stdio-common' make[4]: Leaving directory '/www/wwwroot/report/report2/glibc-2.36/stdio-common' make subdir=string -C ../string ..=../ objdir=/www/wwwroot/report/report2/glibc-2.36/build -f Makefile -f ../elf/rtld-Rules rtld-all rtld-modules='rtld-memchr.os rtld-memcmp.os rtld-memcpy.os rtld-memmove.os rtld-mempcpy.os rtld-memset.os rtld-rawmemchr.os rtld-stpcpy.os rtld-strchr.os rtld-strcmp.os rtld-strcspn.os rtld-strdup.os rtld-strerrorname_np.os rtld-strlen.os rtld-strncmp.os rtld-strnlen.os rtld-memchr-avx2.os rtld-memchr.os rtld-memchr-avx2-rtm.os rtld-memchr.os rtld-memchr-evex.os rtld-memchr.os rtld-memchr-evex-rtm.os rtld-memchr.os rtld-memchr-sse2.os rtld-memchr.os rtld-memcmp-avx2-movbe.os rtld-memcmp.os rtld-memcmp-avx2-movbe-rtm.os rtld-memcmp.os rtld-memcmp-evex-movbe.os rtld-memcmp.os rtld-memcmp-sse2.os rtld-memcmp.os rtld-memmove-avx-unaligned-erms.os rtld-mempcpy.os rtld-memmove-avx-unaligned-erms-rtm.os rtld-mempcpy.os rtld-memmove-avx512-no-vzeroupper.os rtld-mempcpy.os rtld-memmove-avx512-unaligned-erms.os rtld-mempcpy.os rtld-memmove-erms.os rtld-mempcpy.os rtld-memmove-evex-unaligned-erms.os rtld-mempcpy.os rtld-memmove-sse2-unaligned-erms.os rtld-mempcpy.os rtld-memmove-ssse3.os rtld-mempcpy.os rtld-memset-avx2-unaligned-erms.os rtld-memset.os rtld-memset-avx2-unaligned-erms-rtm.os rtld-memset.os rtld-memset-avx512-no-vzeroupper.os rtld-memset.os rtld-memset-avx512-unaligned-erms.os rtld-memset.os rtld-memset-erms.os rtld-memset.os rtld-memset-evex-unaligned-erms.os rtld-memset.os rtld-memset-sse2-unaligned-erms.os rtld-memset.os rtld-rawmemchr-avx2.os rtld-rawmemchr.os rtld-rawmemchr-avx2-rtm.os rtld-rawmemchr.os rtld-rawmemchr-evex.os rtld-rawmemchr.os rtld-rawmemchr-evex-rtm.os rtld-rawmemchr.os rtld-rawmemchr-sse2.os rtld-rawmemchr.os rtld-stpcpy-avx2.os rtld-stpcpy.os rtld-stpcpy-avx2-rtm.os rtld-stpcpy.os rtld-stpcpy-evex.os rtld-stpcpy.os rtld-stpcpy-sse2.os rtld-stpcpy.os rtld-stpcpy-sse2-unaligned.os rtld-stpcpy.os rtld-strchr-avx2.os rtld-strchr.os rtld-strchr-avx2-rtm.os rtld-strchr.os rtld-strchr-evex.os rtld-strchr.os rtld-strchr-sse2.os rtld-strchr.os rtld-strchr-sse2-no-bsf.os rtld-strchr.os rtld-strcmp-avx2.os rtld-strcmp.os rtld-strcmp-avx2-rtm.os rtld-strcmp.os rtld-strcmp-evex.os rtld-strcmp.os rtld-strcmp-sse2.os rtld-strcmp.os rtld-strcmp-sse2-unaligned.os rtld-strcmp.os rtld-strcmp-sse4_2.os rtld-strcmp.os rtld-strcspn-sse4.os rtld-strcspn.os rtld-strlen-avx2.os rtld-strlen.os rtld-strlen-avx2-rtm.os rtld-strlen.os rtld-strlen-evex.os rtld-strlen.os rtld-strlen-sse2.os rtld-strlen.os rtld-strncmp-avx2.os rtld-strncmp.os rtld-strncmp-avx2-rtm.os rtld-strncmp.os rtld-strncmp-evex.os rtld-strncmp.os rtld-strncmp-sse2.os rtld-strncmp.os rtld-strncmp-sse4_2.os rtld-strncmp.os rtld-strnlen-avx2.os rtld-strnlen.os rtld-strnlen-avx2-rtm.os rtld-strnlen.os rtld-strnlen-evex.os rtld-strnlen.os rtld-strnlen-sse2.os rtld-strnlen.os rtld-varshift.os rtld-strcspn-sse4.os rtld-strcspn-generic.os rtld-strcspn.os rtld-cacheinfo.os rtld-memmove-avx512-no-vzeroupper.os rtld-strerrorname_np.os rtld-strchrnul.os rtld-strcspn-generic.os rtld-strchrnul-avx2.os rtld-strchrnul.os rtld-strchrnul-avx2-rtm.os rtld-strchrnul.os rtld-strchrnul-evex.os rtld-strchrnul.os rtld-strchrnul-sse2.os rtld-strchrnul.os' make[4]: Entering directory '/www/wwwroot/report/report2/glibc-2.36/string' make[4]: Leaving directory '/www/wwwroot/report/report2/glibc-2.36/string' make subdir=time -C ../time ..=../ objdir=/www/wwwroot/report/report2/glibc-2.36/build -f Makefile -f ../elf/rtld-Rules rtld-all rtld-modules='rtld-setitimer.os' make[4]: Entering directory '/www/wwwroot/report/report2/glibc-2.36/time' make[4]: Leaving directory '/www/wwwroot/report/report2/glibc-2.36/time' make[3]: Leaving directory '/www/wwwroot/report/report2/glibc-2.36/elf' make[2]: Leaving directory '/www/wwwroot/report/report2/glibc-2.36/elf' /usr/bin/install -c -m 644 /www/wwwroot/report/report2/glibc-2.36/build/libc.a /usr/lib64/libc.a /usr/bin/install -c -m 644 /www/wwwroot/report/report2/glibc-2.36/build/libc_nonshared.a /usr/lib64/libc_nonshared.a /usr/bin/install -c /www/wwwroot/report/report2/glibc-2.36/build/libc.so /lib64/libc.so.6.new mv -f /lib64/libc.so.6.new /lib64/libc.so.6 gcc -shared -nostdlib -nostartfiles \ -x assembler /dev/null -o /www/wwwroot/report/report2/glibc-2.36/build/format.lds.so make[1]: *** [Makerules:1033: /www/wwwroot/report/report2/glibc-2.36/build/format.lds] Segmentation fault make[1]: Leaving directory '/www/wwwroot/report/report2/glibc-2.36' make: *** [Makefile:12: install] Error 2 (venv) [root@iZ7xverg9iufrkfag7y2yzZ build]#
08-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值