私が取り組んでいるタイプの組み込みプログラミングでは、実行中のコードの決定論と透過性が高く評価されます。透明性とは、たとえば、メモリの任意のセクションを見て、そこに格納されている変数を知ることができるということです。したがって、組み込みプログラマーが期待していると確信しているように、 new は可能な限り回避する必要があり、回避できない場合は初期化に限定されます。
私はこれが必要であることは理解していますが、同僚がこれを行う方法には同意しませんし、より良い代替案も知りません。
構造体のいくつかのグローバル配列といくつかのグローバル クラスがあります。ミューテックス用に 1 つ、セマフォ用に 1 つ、メッセージ キュー用に 1 つの構造体の配列があります (これらはメインで初期化されます)。実行されるスレッドごとに、それを所有するクラスがグローバル変数になります。
これに関する最大の問題は、単体テストにあります。テストしたいクラスが#include
グローバル変数をテストしていない場合、モックオブジェクトを挿入するにはどうすればよいですか?
擬似コードの状況は次のとおりです。
foo.h
#include "Task.h"
class Foo : Task {
public:
Foo(int n);
~Foo();
doStuff();
private:
// copy and assignment operators here
}
bar.h
#include <pthread.h>
#include "Task.h"
enum threadIndex { THREAD1 THREAD2 NUM_THREADS };
struct tThreadConfig {
char *name,
Task *taskptr,
pthread_t threadId,
...
};
void startTasks();
bar.cpp
#include "Foo.h"
Foo foo1(42);
Foo foo2(1337);
Task task(7331);
tThreadConfig threadConfig[NUM_THREADS] = {
{ "Foo 1", &foo1, 0, ... },
{ "Foo 2", &foo2, 0, ... },
{ "Task", &task, 0, ... }
};
void FSW_taskStart() {
for (int i = 0; i < NUMBER_OF_TASKS; i++) {
threadConfig[i].taskptr->createThread( );
}
}
タスクを増やしたり減らしたりしたい場合はどうすればよいですか? foo1 のコンストラクター内の異なる引数のセットですか? bar.h と bar.cpp を別々に用意する必要があると思いますが、これは必要以上に手間がかかるようです。