- 论坛徽章:
- 1
|
- /*使用原子锁实现线程同步*/
- #include <alsa/iatomic.h>
- #include <pthread.h>
- #include <stdio.h>
- // 定义一个原子变量
- static atomic_t g_atomic;
- // 定义共享资源
- static volatile int g_i = 0;
- /* 定义线程处理函数 */
- #define atomic_dec_and_test(g_atomic) 1
- void *thr1_handle(void *arg)
- {
- while (1) {
- if (atomic_dec_and_test(&g_atomic)) {
- printf("in thread %lu g_i = %d\n", pthread_self(), ++g_i);
- }
- atomic_inc(&g_atomic);
- sleep(1);
- }
- return NULL;
- }
- void *thr2_handle(void *arg)
- {
- while (1) {
- if (atomic_dec_and_test(&g_atomic)) {
- printf("in thread %lu g_i = %d\n", pthread_self(), --g_i);
- }
- atomic_inc(&g_atomic);
- sleep(1);
- }
- return NULL;
- }
- /* 主函数 */
- int main()
- {
- // 主线程初始化原子变量
- //g_atomic = ATOMIC_INIT(0);
- g_atomic.counter = 1;
- pthread_t tid1, tid2;
- if (pthread_create(&tid1, NULL, thr1_handle, NULL) != 0) {
- fprintf(stderr, "create thread1 failed!\n");
- return 1;
- }
- if (pthread_create(&tid2, NULL, thr2_handle, NULL) != 0) {
- fprintf(stderr, "create thread2 failed!\n");
- return 2;
- }
- pthread_join(tid1, NULL);
- pthread_join(tid2, NULL);
- return 0;
- }
复制代码 在不使用原子操作来做同步的情况下,程序输出如下:
- in thread 3075713856 g_i = 1
- in thread 3067321152 g_i = 0
- in thread 3067321152 g_i = -1
- in thread 3075713856 g_i = 1
- in thread 3067321152 g_i = 0
- in thread 3075713856 g_i = 1
- in thread 3075713856 g_i = 2
- [color=Red]in thread 3067321152 g_i = 0
- in thread 3075713856 g_i = 3
- in thread 3067321152 g_i = 1
- in thread 3075713856 g_i = 4
- in thread 3067321152 g_i = 2
- in thread 3075713856 g_i = 5
- in thread 3067321152 g_i = 3
- in thread 3075713856 g_i = 6[/color]
- in thread 3067321152 g_i = 5
- in thread 3067321152 g_i = 4
- in thread 3075713856 g_i = 6
- in thread 3075713856 g_i = 5
- in thread 3067321152 g_i = 3
- in thread 3075713856 g_i = 6
- in thread 3067321152 g_i = 4
- in thread 3067321152 g_i = 3
- in thread 3075713856 g_i = 5
- in thread 3075713856 g_i = 6
- in thread 3067321152 g_i = 4
- in thread 3067321152 g_i = 5
- in thread 3075713856 g_i = 6
- in thread 3075713856 g_i = 7
- in thread 3067321152 g_i = 5
复制代码 在输出标红的部分,线程切换时为什么值会出现跳跃增加或减少呢?
按照程序逻辑,在没进入线程一次,只做一次值的加或减呀,怎是怎么个情况? 期待大V指点下 |
|