[root@localhost threads]# cat mutex.c
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#define NUMS_ARRAY 30
int num=0;
int arr[NUMS_ARRAY];
void *thread_function(void *arg)
{
int i=(int)arg;
int j;
for(j=0;j<NUMS_ARRAY;j++)
{
printf("%d:%d:%d ",i,j,arr[j]);
arr[j]=j;
printf("%d:%d:%d \n",i,j,arr[j]);
}
}
void *thread_function1(void *arg)
{
int i=(int)arg;
int j;
for(j=0;j<NUMS_ARRAY;j++)
{
printf("%d:%d:%d ",i,j,arr[j]);
arr[j]=99;
printf("%d:%d:%d \n",i,j,arr[j]);
}
}
int main()
{
pthread_t mythread1;
pthread_t mythread2;
if(pthread_create(&mythread1, NULL, thread_function, (void*)1))
{
printf("error creating thread.\n");
abort();
}
else
{
printf("create thread 1\n");
}
if(pthread_create(&mythread2, NULL, thread_function1, (void*)2))
{
printf("error creating thread.\n");
abort();
}
else
{
printf("create thread 2\n");
}
if(pthread_join(mythread1, NULL))
{
printf("error joining thread\n");
abort();
}
else
{
printf("Join thread 1\n");
}
if(pthread_join(mythread2, NULL))
{
printf("error joining thread\n");
abort();
}
else
{
printf("Join thread 2\n");
}
printf("into main thread now, pid%ud \n",(unsigned int)getpid());
int i=0;
for(;i<NUMS_ARRAY;i++)
printf("%d:%d ",i,arr);
printf("\n");
return 0;
}
第一次输出比较正常:
[root@localhost threads]# ./mutex
create thread 1
create thread 2
1:0:0 1:0:0
1:1:0 1:1:1
1:2:0 1:2:2
1:3:0 1:3:3
1:4:0 1:4:4
1:5:0 1:5:5
1:6:0 1:6:6
1:7:0 1:7:7
1:8:0 1:8:8
1:9:0 1:9:9
1:10:0 1:10:10
1:11:0 1:11:11
1:12:0 1:12:12
1:13:0 1:13:13
1:14:0 1:14:14
1:15:0 1:15:15
1:16:0 1:16:16
1:17:0 1:17:17
1:18:0 1:18:18
1:19:0 1:19:19
1:20:0 1:20:20
1:21:0 1:21:21
1:22:0 1:22:22
1:23:0 1:23:23
1:24:0 1:24:24
1:25:0 1:25:25
1:26:0 1:26:26
1:27:0 1:27:27
1:28:0 1:28:28
1:29:0 1:29:29
Join thread 1
2:0:0 2:0:99
2:1:1 2:1:99
2:2:2 2:2:99
2:3:3 2:3:99
2:4:4 2:4:99
2:5:5 2:5:99
2:6:6 2:6:99
2:7:7 2:7:99
2:8:8 2:8:99
2:9:9 2:9:99
2:10:10 2:10:99
2:11:11 2:11:99
2:12:12 2:12:99
2:13:13 2:13:99
2:14:14 2:14:99
2:15:15 2:15:99
2:16:16 2:16:99
2:17:17 2:17:99
2:18:18 2:18:99
2:19:19 2:19:99
2:20:20 2:20:99
2:21:21 2:21:99
2:22:22 2:22:99
2:23:23 2:23:99
2:24:24 2:24:99
2:25:25 2:25:99
2:26:26 2:26:99
2:27:27 2:27:99
2:28:28 2:28:99
2:29:29 2:29:99
Join thread 2
into main thread now, pid6601d
0:99 1:99 2:99 3:99 4:99 5:99 6:99 7:99 8:99 9:99 10:99 11:99 12:99 13:99 14:99 15:99 16:99 17:99 18:99 19:99 20:99 21:99 22:99 23:99 24:99 25:99 26:99 27:99 28:99 29:99
第X次输出就显示出了线程间的竟争:
[root@localhost threads]# ./mutex
create thread 1
create thread 2
1:0:0 1:0:0
1:1:0 1:1:1
1:2:0 1:2:2
1:3:0 1:3:3
1:4:0 1:4:4
1:5:0 1:5:5
2:0:0 2:0:99
2:1:1 2:1:99
2:2:2 2:2:99
2:3:3 2:3:99
2:4:4 2:4:99
2:5:5 2:5:99
2:6:0 2:6:99
2:7:0 2:7:99
2:8:0 2:8:99
2:9:0 2:9:99
2:10:0 2:10:99
2:11:0 2:11:99
2:12:0 2:12:99
2:13:0 2:13:99
2:14:0 2:14:99
2:15:0 2:15:99
2:16:0 2:16:99
2:17:0 2:17:99
2:18:0 2:18:99
2:19:0 2:19:99
2:20:0 2:20:99
2:21:0 2:21:99
2:22:0 2:22:99
2:23:0 2:23:99
2:24:0 2:24:99
2:25:0 2:25:99
2:26:0 2:26:99
2:27:0 2:27:99
2:28:0 2:28:99
2:29:0 2:29:99
1:6:99 1:6:6
1:7:99 1:7:7
1:8:99 1:8:8
1:9:99 1:9:9
1:10:99 1:10:10
1:11:99 1:11:11
1:12:99 1:12:12
1:13:99 1:13:13
1:14:99 1:14:14
1:15:99 1:15:15
1:16:99 1:16:16
1:17:99 1:17:17
1:18:99 1:18:18
1:19:99 1:19:19
1:20:99 1:20:20
1:21:99 1:21:21
1:22:99 1:22:22
1:23:99 1:23:23
1:24:99 1:24:24
1:25:99 1:25:25
1:26:99 1:26:26
1:27:99 1:27:27
1:28:99 1:28:28
1:29:99 1:29:29
Join thread 1
Join thread 2
into main thread now, pid6582d
0:99 1:99 2:99 3:99 4:99 5:99 6:6 7:7 8:8 9:9 10:10 11:11 12:12 13:13 14:14 15:15 16:16 17:17 18:18 19:19 20:20 21:21 22:22 23:23 24:24 25:25 26:26 27:27 28:28 29:29