我正在考虑如何使用尽可能少的asm代码实现信号量(不是二进制).
我没有成功地在没有使用互斥锁的情况下思考和编写它,所以这是迄今为止我能做的最好的事情:
全球:
#include <stdlib.h>
#include <pthread.h>
#include <stdatomic.h>
#include <stdbool.h>
typedef struct
{
atomic_ullong value;
pthread_mutex_t *lock_op;
bool ready;
} semaphore_t;
typedef struct
{
atomic_ullong value;
pthread_mutex_t lock_op;
bool ready;
} static_semaphore_t;
/* use with static_semaphore_t */
#define SEMAPHORE_INITIALIZER(value) = {value, PTHREAD_MUTEX_INITIALIZER, true}
Run Code Online (Sandbox Code Playgroud)
功能:
bool semaphore_init(semaphore_t *semaphore, unsigned long long init_value)
{
if(semaphore->ready) if(!(semaphore->lock_op = \
calloc(1, sizeof(pthread_mutex_t)))) return false;
else pthread_mutex_destroy(semaphore->lock_op);
if(pthread_mutex_init(semaphore->lock_op, NULL))
return false;
semaphore->value = init_value;
semaphore->ready = true;
return true;
}
bool semaphore_wait(semaphore_t *semaphore)
{ …
Run Code Online (Sandbox Code Playgroud) 我发现了CPython实现,Python对象的结构和Python字节码.
玩函数,我发现空函数的堆栈大小为1.
为什么?声明什么var占用堆栈空间?
空功能:
def empty():
pass
Run Code Online (Sandbox Code Playgroud)
功能信息:
>>> dis.show_code(empty)
Name: empty
Filename: <pyshell#27>
Argument count: 0
Kw-only arguments: 0
Stack size: 1
Number of locals: 0
Variable names:
Constants:
0: None
Names:
Flags: OPTIMIZED, NEWLOCALS, NOFREE
First line number: 1
Free variables:
Cell variables:
Run Code Online (Sandbox Code Playgroud)
与当地人的作用:
def withlocals():
first = 0
second = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
功能信息:
>>> dis.show_code(withlocals)
Name: withlocals
Filename: <pyshell#27>
Argument count: 0
Kw-only arguments: 0
Stack size: 3
Number of locals: 2
Variable names:
0: …
Run Code Online (Sandbox Code Playgroud)