线程间同步

    xiaoxiao2025-01-26  47

    线程间同步是多线程的难点之一,它确保多线程程序不会同时执行某些关键的代码片段,否则这些关键代码片段同时执行就会导致不可预期。最严重的可能会引起整个程序的core dump。线程间同步问题一般使用互斥锁来解决。

    pthread_t tid[2]; int counter; void* trythis(void *arg) { for(i=0; i<(0xFFFFFFFF);i++);// 准备瓜 unsigned long i = 0; counter += 1; printf("\n 永强开始吃第 %d 个瓜\n", counter); for(i=0; i<(0xFFFFFFFF);i++); printf("\n 永强吃完第 %d 个瓜\n", counter); return NULL; } int main(void) { int i = 0; int error; while(i < 2) { error = pthread_create(&(tid[i]), NULL, &trythis, NULL); if (error != 0) printf("\nThread can't be created : [%s]", strerror(error)); i++; } pthread_join(tid[0], NULL); pthread_join(tid[1], NULL); return 0; }

    程序输出:

    永强开始吃第1个瓜 永强开始吃第2个瓜 永强吃完第2个瓜 永强吃完第2个瓜

    可以看出因为for(i=0; i<(0xFFFFFFFF);i++)(吃瓜时间); 运行时间较长,counter的值在两个线程中都进行了改变,因此结果只有永强吃完第2个瓜,没有永强吃完第1个瓜。 在这里

    counter += 1; printf("\n 永强开始吃第 %d 个瓜\n", counter); for(i=0; i<(0xFFFFFFFF);i++); printf("\n 永强吃完第 %d 个瓜\n", counter);

    这段算是关键代码了(或者也叫共享资源),不能同时进行更改,这时可以采用互斥锁,让线程中这段代码不并行运行。 这里也比较容易理解,对于这段程序来说,准备瓜的过程,是可以并行的,比如王大拿、刘英都可以过来帮助永强把瓜准备好,比如买瓜、洗瓜、切瓜,一切准备就绪了, 永强一个个吃,永强吃的过程,不能同时吃几个,各个线程遇到这段代码,需要确认是否锁已经释放,某则就一直阻塞着,以这种方式来保证互斥

    void* trythis(void *arg) { for(i=0; i<(0xFFFFFFFF);i++);// 准备瓜 unsigned long i = 0; pthread_mutex_lock(&lock); // 吃瓜锁 counter += 1; printf("\n 永强开始吃第 %d 个瓜\n", counter); for(i=0; i<(0xFFFFFFFF);i++); printf("\n 永强吃完第 %d 个瓜\n", counter); pthread_mutex_unlock(&lock); // 瓜吃完了解锁; return NULL; }

    以上的的代码的输出应该是:

    永强开始吃第1个瓜 永强吃完第1个瓜 永强开始吃第2个瓜 永强吃完第2个瓜
    最新回复(0)