一、product内未加锁,在for循环内进行join
1、代码
#include <fstream>
#include <pthread.h>
using namespace std;
pthread_mutex_t file_mutex;
void* product(void* args){
// pthread_mutex_lock(&file_mutex);
ofstream file;
file.open("file.txt", ios::app);
if(file.good()){
file << *static_cast<int *>(args) << std::endl;
file.close();
}
// pthread_mutex_unlock(&file_mutex);
}
int main(int argc, char* argv[]){
pthread_t producer_id;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
for (int i = 0; i < 200; ++i) {
pthread_create(&producer_id, &attr, product, &i);
// for循环里面进行join那么会等待线程执行完再进行下一个???此时未加锁
pthread_join(producer_id, nullptr);
}
}
2、结果
0到199顺序从小到大。
二、product内未加锁,去除for循环内join
1、代码
#include <fstream>
#include <pthread.h>
using namespace std;
pthread_mutex_t file_mutex;
void* product(void* args){
// pthread_mutex_lock(&file_mutex);
ofstream file;
file.open("file.txt", ios::app);
if(file.good()){
file << *static_cast<int *>(args) << std::endl;
file.close();
}
// pthread_mutex_unlock(&file_mutex);
}
int main(int argc, char* argv[]){
pthread_t producer_id;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
for (int i = 0; i < 200; ++i) {
pthread_create(&producer_id, &attr, product, &i);
// for循环里面进行join那么会等待线程执行完再进行下一个???此时未加锁
// pthread_join(producer_id, nullptr);
}
}
2、结果
5 6 6 6 8 8 10...等共198个数字
三、product内加锁,去除for循环内join
1、代码
#include <fstream>
#include <pthread.h>
using namespace std;
pthread_mutex_t file_mutex;
void* product(void* args){
pthread_mutex_lock(&file_mutex);
ofstream file;
file.open("file.txt", ios::app);
if(file.good()){
file << *static_cast<int *>(args) << std::endl;
file.close();
}
pthread_mutex_unlock(&file_mutex);
}
int main(int argc, char* argv[]){
pthread_t producer_id;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
for (int i = 0; i < 200; ++i) {
pthread_create(&producer_id, &attr, product, &i);
// pthread_join(producer_id, nullptr);
}
}
2、结果
5 8 10 13 16 19...等共65个数字