我一直在通讀并嘗試應用Tyler Hoffman 的 C/C 單元測驗策略。
他提供了以下方法來偽造互斥鎖:
#define NUM_MUTEXES 256
typedef struct Mutex {
uint8_t lock_count;
} Mutex;
static Mutex s_mutexes[NUM_MUTEXES];
static uint32_t s_mutex_index;
// Fake Helpers
void fake_mutex_init(void) {
memset(s_mutexes, 0, sizeof(s_mutexes));
}
bool fake_mutex_all_unlocked(void) {
for (int i = 0; i < NUM_MUTEXES; i ) {
if (s_mutexes[i].lock_count > 0) {
return false;
}
}
return true;
}
// Implementation
Mutex *mutex_create(void) {
assert(s_mutex_index < NUM_MUTEXES);
return &s_mutexes[s_mutex_index ];
}
void mutex_lock(Mutex *mutex) {
mutex->lock_count ;
}
void mutex_unlock(Mutex *mutex) {
mutex->lock_count--;
}
對于具有以下功能的模塊:
#include "mutex/mutex.h"
static Mutex *s_mutex;
void kv_store_init(lfs_t *lfs) {
...
s_mutex = mutex_create();
}
bool kv_store_write(const char *key, const void *val, uint32_t len) {
mutex_lock(s_mutex); // New
...
mutex_unlock(s_mutex); // New
analytics_inc(kSettingsFileWrite);
return (rv == len);
}
在測驗中設定后:
TEST_GROUP(TestKvStore) {
void setup() {
fake_mutex_init();
...
}
...
}
我對幾件事感到困惑:
- 如何
fake_mutex_init()導致使用mutex_lock和mutex_unlock使用假鎖和解鎖的方法? - 這實際上是如何偽造互斥鎖的?我可以用這些假貨制造僵局嗎?或者,我應該在測驗中檢查鎖定計數嗎?
uj5u.com熱心網友回復:
fake_mutex_init() 如何導致使用 mutex_lock 和 mutex_unlock 的方法使用假鎖和解鎖?
它沒有。這是無關的。
在本教程中,測驗與其中一個實作相關聯。在此特定測驗的情況下,它與此假互斥體實作相關聯。
這實際上是如何偽造互斥鎖的?
它只是增加陣列中的一些整數。沒有以任何方式涉及“鎖定”。
我可以用這些假貨制造僵局嗎?
不會,因為有鎖,沒有等待,所以不會出現兩個執行緒互相等待的死鎖。
或者,我應該在測驗中檢查鎖定計數嗎?
不是,在“測驗”中 - 對于測驗互斥鎖是一個抽象的東西。
添加assert(mutex->lock_count > 0)以unlock檢查您的測驗是否沒有兩次解鎖互斥鎖似乎是一個明顯的改進。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/396431.html
