小编Pře*_* J.的帖子

替换CMake列表中的值

我需要替换CMake列表中的值,但似乎没有任何支持此列表操作.

我想出了这段代码:

macro (LIST_REPLACE LIST INDEX NEWVALUE)
    list (REMOVE_AT ${LIST} ${INDEX})
    list (LENGTH ${LIST} __length)

    # Cannot insert at the end
    if (${__length} EQUAL ${INDEX})
        list (APPEND ${LIST} ${NEWVALUE})
    else (${__length} EQUAL ${INDEX})
        list (INSERT ${LIST} ${INDEX} ${NEWVALUE})
    endif (${__length} EQUAL ${INDEX})
endmacro (LIST_REPLACE)

# Example
set (fubar A;B;C)
LIST_REPLACE (fubar 2 "X")
message (STATUS ${fubar})
Run Code Online (Sandbox Code Playgroud)

你有更好的想法如何实现这一目标吗?

cmake

9
推荐指数
1
解决办法
2650
查看次数

库初始化 - Win32实现中的pthread_once

你好.我试图为我的库创建一个完全线程安全的初始化函数,我不能轻易找到pthread_once的替代品,这应该很容易解决问题.我来这个代码:


void libInit (void)
{
#ifdef WIN32
    static volatile int initialized = 0;
    static HANDLE mtx;

    if (!initialized)
    {
        if (!mtx)
        {
            HANDLE mymtx;
            mymtx = CreateMutex(NULL, 0, NULL);
            if (InterlockedCompareExchangePointer(&mtx, mymtx, NULL) != NULL)
                CloseHandle(mymtx);
        }

        WaitForSingleObject(mtx);
        if (!initialized)
        {
            libInitInternal();
            initialized = 1;
        }
        ReleaseMutex(mtx);
    }
#else
    static pthread_once_t initialized = PTHREAD_ONCE_INIT;

    pthread_once(&initialized, libInitInternal);
#endif
}
Run Code Online (Sandbox Code Playgroud)

libInitInternal()调用导致线程安全的功能,即初始化库.

我想听听有关我可能做错的建议或是否了解更好的解决方案.

c winapi initialization

4
推荐指数
1
解决办法
3679
查看次数

标签 统计

c ×1

cmake ×1

initialization ×1

winapi ×1