Tag: 条件

这种信号量的实现如何工作?

圣诞快乐! 我正在读“信号量小书” 。 书中有一个C语言的实现,我并不完全理解。 请参阅下面的代码。 有这个唤醒变量。 作者解释说: 唤醒计算未决信号的数量; 也就是说,已被唤醒但尚未恢复执行的线程数。 唤醒的原因是为了确保我们的信号量具有第4.3节中描述的属性3 和 属性3:如果线程执行信号时有线程在等待信号量,则必须唤醒其中一个等待线程。 好的,我想我理解了这个属性的含义。 其中一个等待线程应该获取互斥锁而不是另一个(例如信令线程)。如果我错了,请纠正我。 我不明白的是这个机制如何保证这个属性。 我会说房产不保证。 非等待进程仍然可能获得互斥锁。 我错过了什么? typedef struct { int value, wakeups; Mutex *mutex; Cond *cond; } Semaphore; // SEMAPHORE Semaphore *make_semaphore (int value) { Semaphore *semaphore = check_malloc (sizeof(Semaphore)); semaphore->value = value; semaphore->wakeups = 0; semaphore->mutex = make_mutex (); semaphore->cond = make_cond […]

使用按位运算符的条件语句

所以我看到这个问题已经被提出,但答案有点模糊,无益。 好的,我只需要使用“&^〜!+ | >> <<”来实现ac表达式 表达式需要类似:a? b:c 所以,从我能够讲述的,表达式需要看起来像: return (a & b) | (~a & c) 当a = 0时,这是有效的,因为用b进行和将得到零,然后或表达式将返回右侧, (~a & c) ,因为~0给出所有1,并且使用所有1返回c返回c 。 但是,当a> 0时,这不起作用。有人可以尝试解释为什么会这样,或者如何解决它?

有条件的宏扩张

抬头:这是一个奇怪的问题。 我有一些非常有用的宏,我喜欢用来简化一些日志记录。 例如,我可以做Log(@”My message with arguments: %@, %@, %@”, @”arg1″, @”arg2″, @”arg3″) ,这将扩展为更复杂的方法调用包括self , _cmd , __FILE__ _cmd __FILE__ , _cmd等等,以便我可以轻松跟踪记录事件的位置。 这很好用。 现在我想扩展我的宏,不仅可以使用Objective-C方法,还可以使用常规的C函数。 问题是宏扩展中的self和_cmd部分。 C函数中不存在这两个参数。 理想情况下,我希望能够在C函数中使用同一组宏,但我遇到了问题。 当我使用(例如)我的Log()宏时,我得到关于self和_cmd未声明的编译器警告(这完全有道理)。 我的第一个想法是做类似以下的事情(在我的宏中): if (thisFunctionIsACFunction) { DoLogging(nil, nil, format, ##__VA_ARGS__); } else { DoLogging(self, _cmd, format, ##__VA_ARGS__); } 这仍然会产生编译器警告,因为整个if()语句被替换代替宏,导致self和_cmd关键字出错(即使它们在函数执行期间永远不会被执行)。 我的下一个想法是做这样的事情(在我的宏中): if (thisFunctionIsACFunction) { #define SELF nil #define CMD nil } […]

同时执行if和else块

在C或C ++中 if ( x ) statement1; else statement2; 两个语句的执行值是什么? 我知道我们可以像这样一起执行if-else : if(1){ goto ELSE; } else{ ELSE: } 有什么办法,比如价值吗? (我认为这是不可能的。问,因为有人在争论!)