次のコードは、nとvの両方に対してランダムな値を生成します.nが適切に保護されていないとランダムであることは驚くことではありません。しかし、vは最終的に0になるはずです。私のコードに何か間違いはありますか?それとも誰も私のためにこれを説明することができますか?ありがとう。atomic.hからの操作は非アトミックなようです
私はx86アーキテクチャの4コアサーバーで作業しています。 unameは次のとおりです。
Linuxの2.6.9-22.ELsmp#1 SMP月9月19日18時00分54秒EDT 2005 x86_64のx86_64でのx86_64版は、GNU/Linuxの
#include <stdio.h>
#include <pthread.h>
#include <asm-x86_64/atomic.h>
int n = 0;
atomic_t v;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
#define LOOP 10000
void* foo(void *p)
{
int i = 0;
for(i = 0; i < LOOP; i++) {
// pthread_mutex_lock(&mutex);
++n;
--n;
atomic_inc(&v);
atomic_dec(&v);
// pthread_mutex_unlock(&mutex);
}
return NULL;
}
#define COUNT 50
int main(int argc, char **argv)
{
int i;
pthread_t pids[COUNT];
pthread_attr_t attr;
pthread_attr_init(&attr);
atomic_set(&v, 0);
for(i = 0; i < COUNT; i++) {
pthread_create(&pids[i], &attr, foo, NULL);
}
for(i = 0; i < COUNT; i++) {
pthread_join(pids[i], NULL);
}
printf("%d\n", n);
printf("%d\n", v);
return 0;
}
私は答えはありませんが、私は言いたいことがあります:完全に動作するソースコードではっきりとした、明確な質問に感謝します。誰もがそうしたいと思う! – RichieHindle