c-线程:Main覆盖互斥锁



我对线程编程相当陌生,我想测试互斥锁的功能。所以我编写了以下程序来测试它

**线程_测试.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

此外,您可以在这里发布之前对代码进行缩进,这将大大有助于提高代码的可读性。

最新更新