C 多线程互斥锁pthead_mutex_t
进行C多线程开发时,需要调用<pthread.h>中的相关变量定义以及函数,对于新建一个线程无外乎下面几个步骤:
1、定义线程函数;
2、定义线程标识符pthread_t;
3、通过pthread_create函数创建线程;
4、调用pthread_join阻塞进程使得线程中函数完全运行(可选)
#include <pthread.h>
void* testPthread(void* arg)
{
printf("Hello testPthread");
}
int main()
{
pthread_t test;
if (pthread_create(&test, NULL, testPthread, NULL) != -1)
{
printf("pthreadTest create success\n");
}
pthread_join(test, NULL); //可选,不加的话,有可能线程中还未输出完全,主函数已结束
return 0;
}
更多关于pthread的介绍参考此篇博客,需要注意的一点是,如果是在linux下编译运行,需要在编译命令最后加上-lpthread参数。
在多线程中,如果对同一变量进行了操作,如多写多读,则会导致该变量数据不一致,而且在linux下极易报Segmentation Fault,我也是深受其害,这里做个检讨,开辟多线程却不加锁维护变量,这是一种极不负责的习惯。正确做法应该是,在线程中需要对该变量进行操作时,先对其加锁,操作结束后释放锁,这样在其它线程尝试操作变量时,会先请求获得锁,如果其它线程已经获得了锁,那么该线程将阻塞等待,直到其它线程释放锁,该线程才能够操作此变量,如下所示:
#include <pthread.h>
int testData = 0;
pthread_mutex_t testLock = PTHREAD_MUTEX_INITIALIZER;
void* testPthread1(void* arg)
{
while(1)
{
pthread_lock(&testLock);
printf("Pthread1 operation\n");
pthread_unlock(&testLOck);
}
}
void* testPthread2(void* arg)
{
pthread_lock(&testLock);
printf("Pthread2 operation\n");
pthread_unlock(&testLOck);
}
int main()
{
pthread_t test1, test2;
if (pthread_create(&test1, NULL, testPthread1, NULL) != -1)
{
printf("pthreadTest1 create success\n");
}
if (pthread_create(&test2, NULL, testPthread2, NULL) != -1)
{
printf("pthreadTest1 create success\n");
}
pthread_join(test2, NULL); //可选 不加的话,主函数就直接return结束了
return 0;
}
这里仅用到了互斥锁,即pthead_mutex_t,更多关于锁的介绍,如读写锁等等,参考此篇博客。