在下面的代碼中,我只是想看看我是否能夠從每個線程插入一個元素到數組中。它按預期工作。但後來我想知道,在什麼情況下,這裏可能會出現競賽狀況。我真的需要在這裏變動嗎,還是信號量?我試圖刪除信號量和易變的關鍵字,仍然有效。我想在這裏引發並看到競賽情況。在同一行上,我可以從每個線程創建一個節點,並將所有節點放入鏈接列表中?這些都是虛構的場景..!C多線程:競態條件場景
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include "small_appl.h"
void * thread_func(void * arg);
int itr=0;
volatile int idx=0; //array index variable
sem_t sem1;
int arr_th[5]; //array where each thread will insert an element
int func_pointed(int a,int num_t)
{
pthread_t arr_thr[num_t];
int iter;
//create threads
for(iter=0;iter<num_t;iter++)
{
pthread_create(&arr_thr[iter],NULL,thread_func,(void *)a);
}
for (iter=0;iter<num_t;iter++)
{
pthread_join(arr_thr[iter],NULL);
}
}
int main(void)
{
int ip1=5,ip2=10,rev;
rev=sem_init(&sem1,0,0);
s_type dev_s={
.f_ptr=func_pointed,
.str="Diwakar",
.val=5
};
//initialize semaphore to 1
sem_post(&sem1);
func_aux(ip1,dev_s);
for(rev=0;rev<5;rev++)
{
printf("array : %d ",arr_th[rev]);
}
}
void * thread_func(void * arg)
{
sem_wait(&sem1);
printf("Got sema\n");
arr_th[idx]=itr;
idx++; itr++;
printf("Releasing sema\n");
sem_post(&sem1);
sleep(5);
}
在C中,'volatile'並不意味着你的想法。特別是,它不同於一個原子變量或任何進行內存同步的東西。 –
競態條件不容易產生。C語言中的volatile只是爲了告訴編譯器不要爲這個變量優化,而不是爲了多線程目的。 – JackyZhu
在此代碼中,您不需要任何位置的「volatile」*。你也不需要信號量,因爲無論如何你真正使用它是一個互斥量(如果你拋出信號量,你就需要*)*。 – WhozCraig