小编Cin*_*air的帖子

C预处理器删除尾随逗号

我有一个像这样的宏:

#define C( a... ) ( char *[] ){ a, 0 }
Run Code Online (Sandbox Code Playgroud)

这适用于非空参数:

C( "a", "b" ) => ( char *[] )( "a", "b", 0 }
Run Code Online (Sandbox Code Playgroud)

但是我想在提供空参数时删除尾随逗号:

C() => ( char *[] ){ , 0 }
Run Code Online (Sandbox Code Playgroud)

这可能吗?

c gcc c-preprocessor

13
推荐指数
2
解决办法
629
查看次数

多线程中的 Vulkan 队列同步

在我的应用程序中,“状态”和“图形”必须在单独的线程中处理。例如,“状态”线程只关心更新对象位置,而“图形”线程只关心以图形方式输出当前状态。

为简单起见,假设整个状态数据包含在单个VkBuffer. “状态”线程创建一个Compute PipelineStorage Buffer支撑的VkBuffer,并定期vkCmdDispatch更新VkBuffer

同时,“图形”线程创建一个由相同的支持的Graphics Pipeline,并定期绘制。Uniform BufferVkBuffervkQueuePresentKHR

显然,必须有某种同步机制来防止“图形”线程在VkBuffer“状态”线程写入时读取它。

vkQueueSubmit我唯一的想法是在两个线程中使用主机互斥锁vkWaitForFences

我想知道,是否还有其他更有效的方法或者这被认为是可以的?

concurrency multithreading vulkan

5
推荐指数
1
解决办法
3282
查看次数

pthread_cond_timedwait超时后,线程是否拥有互斥锁?

线程调用后pthread_cond_timedwait,它返回ETIMEDOUT,线程是否拥有互斥锁?

我最初会认为不,但似乎我们必须pthread_mutex_unlockpthread_cond_timedwait回归后打电话ETIMEDOUT.

文件说:

成功返回后,互斥锁应被锁定并由调用线程拥有.

因此,在不成功返回(返回值!= 0)时,我认为互斥锁不属于.

但是,如果我们不叫pthread_mutex_unlockETIMEDOUT,互斥似乎是一个破碎的状态(即我不能让另一个线程来收购它,它只是档).

该文档也暗示了这一点,因为它们总是解锁互斥锁,无论返回值如何pthread_cond_timedwait:

(void) pthread_mutex_lock(&t.mn);
                t.waiters++;
        clock_gettime(CLOCK_REALTIME, &ts);
        ts.tv_sec += 5;
        rc = 0;
        while (! mypredicate(&t) && rc == 0)
                rc = pthread_cond_timedwait(&t.cond, &t.mn, &ts);
        t.waiters--;
        if (rc == 0) setmystate(&t);
(void) pthread_mutex_unlock(&t.mn);
Run Code Online (Sandbox Code Playgroud)

那么,线程总是在获得互斥量之后pthread_cond_timedwait?它实际上没有意义,因为为了再次获取互斥锁,调用必须阻止超过指定的时间.

multithreading posix pthreads condition-variable

2
推荐指数
1
解决办法
612
查看次数