我有一个像这样的宏:
#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)
这可能吗?
在我的应用程序中,“状态”和“图形”必须在单独的线程中处理。例如,“状态”线程只关心更新对象位置,而“图形”线程只关心以图形方式输出当前状态。
为简单起见,假设整个状态数据包含在单个VkBuffer. “状态”线程创建一个Compute Pipeline由Storage Buffer支撑的VkBuffer,并定期vkCmdDispatch更新VkBuffer。
同时,“图形”线程创建一个由相同的支持的Graphics Pipeline,并定期绘制。Uniform BufferVkBuffervkQueuePresentKHR
显然,必须有某种同步机制来防止“图形”线程在VkBuffer“状态”线程写入时读取它。
vkQueueSubmit我唯一的想法是在两个线程中使用主机互斥锁vkWaitForFences。
我想知道,是否还有其他更有效的方法或者这被认为是可以的?
线程调用后pthread_cond_timedwait,它返回ETIMEDOUT,线程是否拥有互斥锁?
我最初会认为不,但似乎我们必须pthread_mutex_unlock在pthread_cond_timedwait回归后打电话ETIMEDOUT.
该文件说:
成功返回后,互斥锁应被锁定并由调用线程拥有.
因此,在不成功返回(返回值!= 0)时,我认为互斥锁不属于.
但是,如果我们不叫pthread_mutex_unlock后ETIMEDOUT,互斥似乎是一个破碎的状态(即我不能让另一个线程来收购它,它只是档).
该文档也暗示了这一点,因为它们总是解锁互斥锁,无论返回值如何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?它实际上没有意义,因为为了再次获取互斥锁,调用必须阻止超过指定的时间.