
このコードを使用して、スピンロックがコンテキスト切り替えを防止する方法を視覚化します。
pthread_spinlock_t lock;
void pp()
{
pthread_spin_lock(&lock);
char d = 'D';
while(1) write(1, &d, 1);
}
void ppp()
{
char a = 'C';
while(1) write(1, &a, 1);
}
int main()
{
pthread_t thread;
pthread_t tthread;
pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);
pthread_create(&thread, NULL, pp, NULL);
pthread_create(&tthread, NULL, ppp, NULL);
pthread_join(thread, NULL);
pthread_join(tthread,NULL);
}
問題は、pp()と出力が完了したときにロックを解除しないため、2番目のスレッドに切り替えないことを期待していることですDDDDDDDDDDDD
。私の理解では、コンテキスト切り替えを防ぐ必要があるからです。しかし、私が得た出力は次の形式です。DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC
...
これをどのように説明できますか?スピンロックの私の理解が間違っていますか?
答え1
相互に排他的でなければならないすべてのスレッドでロックを獲得する必要があります。
void ppp()
{
pthread_spin_lock(&lock);
char a = 'C';
while(1) write(1, &a, 1);
}
コンテキストスイッチングはそうではありません。防ぐロックによってスレッドが同じロックを獲得しようとすると、スレッドが同時に進行するのを防ぐことができます。ロックを獲得できるまでロックを獲得できないスレッドが回転します。