声明:本博文用于学习总结及工作心得
1.线程同步与代码无关,只与mutex相关;不同mutex,多个线程之间不能同步互斥;
2.多线程的意义在于并发, 同步互斥的意义在于多个线程执行相同代码,不添加同步,不给mutex加锁(结束时要解锁),
代码执行的结果不确定,比如对静态变量进行操作
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//初始化一个mutex锁, 这是一条原子操作,不可能出现两个线程同时执行这个代码
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;//初始化第二个mutex锁
//线程同步
void *func(void *arg)
{
pthread_mutex_lock(&mutex);//给mutex加锁
int *a = (int *)arg;
printf("thread %d start\n", *a);
int i;
for(i = 0; i < 10; i++)
{
printf("thread %d is tunning\n", *a);
sleep(1);
}
printf("thread%d end\n", *a);
pthread_mutex_unlock(&mutex);//给mutex解锁
pthread_exit(NULL);
}
void *func2(void *arg)
{
pthread_mutex_lock(&mutex2);//给mutex加锁
int *a = (int *)arg;
printf("thread %d start\n", *a);
int i;
for(i = 0; i < 10; i++)
{
printf("thread %d is tunning\n", *a);
sleep(1);
}
printf("thread%d end\n", *a);
pthread_mutex_unlock(&mutex2);//给mutex解锁
pthread_exit(NULL);
}
int main(int arg, char * args[])
{
printf("process start\n");
pthread_t thrd, thrd2;
int i[2];
i[0] =1; i[1]=2;
pthread_create(&thrd, NULL,func, &i[0]);
pthread_create(&thrd2, NULL,func2, &i[1]);
pthread_join(thrd, NULL);
pthread_join(thrd2, NULL);
printf("process end\n");
return 0;
}
main 函数中创建了两个线程,两个线程执行的代码不一样,加的锁不一样,这样的线程操作并没有意义,初始化的第二个mutex也更本不能与其它线程同步互斥,因为不是相同的mutex;多个线程之间同步互斥与代码无关,只与mutex有关系;
注释func2 注释mutex2, 将pthread_create(&thrd2, NULL,func2, &i[1]); 改为pthread_create(&thrd2, NULL,func, &i[1]);
一旦mutex被某一个线程加锁后,其它线程再去执行加锁,该线程将会被阻塞,直到mutex被前一个线程解锁后,其它线程才能继续执行
线程thrd与thrd2在线程启动后就已经是同步互斥的关系;总的来说,linux下的线程同步机相对简单多了