我对线程编程相当陌生,我想测试互斥锁的功能。所以我编写了以下程序来测试它
**线程_测试.h
...
extern int flags;
extern pthread_mutex my_mutex;
...
**thread_test.c
...
#include"thread_test.h"
...
void * thread_test(void *thread_parameters)
{
long tid = (long) thread_parameters;
pthread_mutex_lock(&my_mutex);
++flags;
printf("**THREAD %d** started. Flag value is %d.n",tid, flags);
sleep(6);
pthread_mutex_unlock(&my_mutex);
pthread_exit(NULL);
}
...
**main.c
...
#include"thread_test.h"
...
#define THREADS 5
pthread_t threads[THREADS];
pthread_mutex_t my_mutex;
int flags = 0;
...
int main(){
int rct;
for(rct = 0; rct<THREADS; rct++)
if(pthread_create(&threads[rct],NULL, thread_test, (void *)rct))
printf("ERROR!")
else
{
sleep(1);
printf("Thread %d initialised in main and the flags value is %d.n", rct,flags);
}
pthread_mutex_destroy(&my_mutex);
...
看起来,即使我将互斥锁锁定在子线程中,主程序也会在线程拥有互斥锁时以某种方式覆盖互斥锁,并为变量标志分配一个新值。。
有人知道为什么会发生这种事吗?
据我所见,您的代码中有几个错误,如果您打开所有警告,编译器应该会告诉您其中的一部分。
-
必须初始化
pthread_mutex_t
变量。对于静态初始化,在定义时使用= PTHREAD_MUTEX_INITIALIZER
就足够了。(破坏另一端的静态互斥没有多大意义。) -
在您给出的代码片段中,
main
看不到thread_test
的声明 -
在线程终止之前退出
main
(并销毁互斥对象)。你可以这样做,但你必须在main
中使用一个解释pthread_exit
(然后绝对不要破坏)。通常使用的方法不是这样做,而是对已创建的所有线程使用pthread_join
。
此外,您可以在这里发布之前对代码进行缩进,这将大大有助于提高代码的可读性。