Trong C / C ++, các biến toàn cầu có tệ như giáo sư của tôi nghĩ không?
Trong C / C ++, các biến toàn cầu có tệ như giáo sư của tôi nghĩ không?
Câu trả lời:
Vấn đề với các biến toàn cục là vì mọi hàm đều có quyền truy cập vào các biến này, nên ngày càng khó để tìm ra hàm nào thực sự đọc và ghi các biến này.
Để hiểu cách ứng dụng hoạt động, bạn phải tính đến mọi chức năng thay đổi trạng thái toàn cầu. Điều đó có thể được thực hiện, nhưng khi ứng dụng phát triển, nó sẽ trở nên khó khăn hơn đến mức gần như không thể (hoặc ít nhất là hoàn toàn lãng phí thời gian).
Nếu bạn không dựa vào các biến toàn cục, bạn có thể chuyển trạng thái xung quanh giữa các chức năng khác nhau khi cần. Bằng cách đó, bạn có cơ hội hiểu rõ hơn về từng chức năng, vì bạn không cần phải tính đến trạng thái toàn cầu.
Điều quan trọng là phải nhớ mục tiêu tổng thể: sự rõ ràng
Quy tắc "không có biến toàn cục" là có bởi vì hầu hết thời gian, các biến toàn cục làm cho ý nghĩa của mã không rõ ràng.
Tuy nhiên, giống như nhiều quy tắc, mọi người nhớ quy tắc, và không phải những gì quy tắc được dự định làm.
Tôi đã thấy các chương trình dường như tăng gấp đôi kích thước của mã bằng cách chuyển một số lượng lớn các tham số xung quanh chỉ đơn giản là để tránh sự xấu xa của các biến toàn cục. Cuối cùng, việc sử dụng toàn cầu sẽ giúp chương trình rõ ràng hơn với những người đọc nó. Bằng cách vô thức tuân thủ từ của quy tắc, lập trình viên ban đầu đã thất bại trong ý định của quy tắc.
Vì vậy, vâng, toàn cầu thường là xấu. Nhưng nếu bạn cảm thấy rằng cuối cùng, ý định của lập trình viên được làm rõ hơn bằng cách sử dụng các biến toàn cục, thì hãy tiếp tục. Tuy nhiên, hãy nhớ sự giảm độ rõ ràng sẽ tự động xảy ra khi bạn buộc ai đó truy cập vào đoạn mã thứ hai (toàn cầu) để hiểu cách hoạt động của đoạn đầu tiên.
Giáo sư của tôi đã từng nói điều gì đó như: sử dụng các biến toàn cục là ổn nếu bạn sử dụng chúng đúng cách. Tôi không nghĩ mình đã từng sử dụng chúng một cách chính xác, vì vậy tôi hiếm khi sử dụng chúng.
static
các biến toàn cục rất nhiều, ngôn ngữ là C. Bị giới hạn trong các đơn vị dịch tương đối nhỏ, họ bắt đầu giống với các biến lớp của các đối tượng C ++.
program lifetime, file scope variables
. Và chúng trở nên khá toàn cầu khi bạn chuyển một con trỏ tới biến sang thế giới bên ngoài (điều này là không thể với các biến tự động) ..
static
Biến toàn cầu có phạm vi giới hạn trong cùng một đơn vị dịch. Nhưng họ có thời gian tồn tại cho đến khi kết thúc chương trình như bất kỳ biến toàn cầu nào.
Biến toàn cục chỉ nên được sử dụng khi bạn không có sự thay thế. Và vâng, bao gồm Singletons. 90% thời gian, các biến toàn cục được giới thiệu để tiết kiệm chi phí chuyển xung quanh một tham số. Và sau đó mã hóa đa luồng / kiểm tra đơn vị / bảo trì xảy ra, và bạn có một vấn đề.
Vì vậy, có, trong 90% các tình huống biến toàn cầu là xấu. Các trường hợp ngoại lệ không thể được nhìn thấy bởi bạn trong những năm đại học của bạn. Một ngoại lệ tôi có thể nghĩ ra khỏi đỉnh đầu của mình là đối phó với các đối tượng toàn cầu vốn có như các bảng ngắt. Những thứ như kết nối DB dường như là toàn cầu, nhưng không phải vậy.
Vấn đề mà các biến toàn cục tạo ra cho lập trình viên là nó mở rộng bề mặt khớp nối giữa các thành phần giữa các thành phần khác nhau đang sử dụng các biến toàn cục. Điều này có nghĩa là khi số lượng các thành phần sử dụng biến toàn cục tăng lên, độ phức tạp của các tương tác cũng có thể tăng lên. Sự ghép nối tăng này thường làm cho các khuyết tật dễ dàng xâm nhập vào hệ thống hơn khi thực hiện các thay đổi và cũng làm cho các khiếm khuyết khó chẩn đoán và sửa chữa hơn. Sự kết hợp tăng này cũng có thể làm giảm số lượng tùy chọn khả dụng khi thực hiện thay đổi và nó có thể tăng nỗ lực cần thiết cho các thay đổi vì thường người ta phải theo dõi các mô-đun khác nhau cũng đang sử dụng biến toàn cục để xác định hậu quả của thay đổi.
Mục đích của việc đóng gói , về cơ bản ngược lại với việc sử dụng các biến toàn cục, là giảm khớp nối để giúp hiểu và thay đổi nguồn dễ dàng hơn, an toàn hơn và dễ dàng kiểm tra hơn. Sử dụng thử nghiệm đơn vị sẽ dễ dàng hơn nhiều khi các biến toàn cục không được sử dụng.
Ví dụ: nếu bạn có một biến số nguyên toàn cầu đơn giản đang được sử dụng làm chỉ số liệt kê mà các thành phần khác nhau sử dụng làm máy trạng thái và sau đó bạn thực hiện thay đổi bằng cách thêm trạng thái mới cho một thành phần mới, sau đó bạn phải theo dõi tất cả các trạng thái khác các thành phần để đảm bảo rằng sự thay đổi sẽ không ảnh hưởng đến chúng. Một ví dụ về một vấn đề có thể xảy ra là nếu một switch
câu lệnh kiểm tra giá trị của biến toàn cục liệt kê với các case
câu lệnh cho từng giá trị hiện tại đang được sử dụng ở nhiều nơi và điều đó xảy ra rằng một số switch
câu lệnh không có default
trường hợp nào để xử lý một giá trị bất ngờ cho toàn cầu đột nhiên bạn có hành vi không xác định cho đến khi ứng dụng có liên quan.
Mặt khác, việc sử dụng vùng dữ liệu dùng chung có thể được sử dụng để chứa một tập hợp các tham số toàn cục được tham chiếu trong toàn bộ ứng dụng. Cách tiếp cận này thường được sử dụng với các ứng dụng nhúng có dấu chân bộ nhớ nhỏ.
Khi sử dụng các biến toàn cục trong các loại ứng dụng này, trách nhiệm ghi vào vùng dữ liệu được phân bổ cho một thành phần duy nhất và tất cả các thành phần khác nhìn thấy vùng đó const
và đọc từ nó, không bao giờ ghi vào nó. Thực hiện phương pháp này giới hạn các vấn đề có thể phát triển.
Một vài vấn đề từ các biến toàn cầu cần được xử lý
Khi nguồn cho một biến toàn cục như struct được sửa đổi, mọi thứ sử dụng nó phải được biên dịch lại để mọi thứ sử dụng biến đó đều biết kích thước thật và mẫu bộ nhớ của nó.
Nếu có nhiều hơn một thành phần có thể sửa đổi biến toàn cục, bạn có thể gặp sự cố với dữ liệu không nhất quán nằm trong biến toàn cục. Với một ứng dụng đa luồng, có lẽ bạn sẽ cần thêm một số loại khóa hoặc vùng quan trọng để cung cấp một cách để chỉ một luồng tại một thời điểm có thể sửa đổi biến toàn cục và khi một luồng đang sửa đổi biến, mọi thay đổi đã hoàn tất và cam kết trước khi các chủ đề khác có thể truy vấn biến hoặc sửa đổi nó.
Việc gỡ lỗi một ứng dụng đa luồng sử dụng biến toàn cục có thể khó khăn hơn. Bạn có thể chạy vào các điều kiện chủng tộc có thể tạo ra các khiếm khuyết khó tái tạo. Với một số thành phần giao tiếp thông qua một biến toàn cục, đặc biệt là trong một ứng dụng đa luồng, việc có thể biết thành phần nào đang thay đổi biến khi nào và làm thế nào nó thay đổi biến có thể rất khó hiểu.
Tên xung đột có thể là một vấn đề với việc sử dụng các biến toàn cục. Một biến cục bộ có cùng tên với một biến toàn cục có thể ẩn biến toàn cục. Bạn cũng gặp phải vấn đề quy ước đặt tên khi sử dụng ngôn ngữ lập trình C. Một cách giải quyết là phân chia hệ thống thành các hệ thống con với các biến toàn cục cho một hệ thống con cụ thể bắt đầu bằng ba chữ cái đầu tiên (xem phần này để giải quyết xung đột không gian tên trong mục tiêu C ). C ++ cung cấp các không gian tên và với C, bạn có thể giải quyết vấn đề này bằng cách tạo một cấu trúc có thể nhìn thấy toàn cầu với các thành viên là các mục dữ liệu khác nhau và các con trỏ tới dữ liệu và các hàm được cung cấp trong một tệp dưới dạng tĩnh do đó chỉ có thể được tham chiếu qua cấu trúc có thể nhìn thấy trên toàn cầu.
Trong một số trường hợp, ý định ứng dụng ban đầu được thay đổi để các biến toàn cục cung cấp trạng thái cho một luồng được sửa đổi để cho phép một số luồng trùng lặp chạy. Một ví dụ sẽ là một ứng dụng đơn giản được thiết kế cho một người dùng sử dụng các biến toàn cục cho trạng thái và sau đó yêu cầu xuất phát từ quản lý để thêm giao diện REST để cho phép các ứng dụng từ xa hoạt động như người dùng ảo. Vì vậy, bây giờ bạn bắt đầu phải nhân đôi các biến toàn cục và thông tin trạng thái của chúng để người dùng đơn lẻ cũng như từng người dùng ảo từ các ứng dụng từ xa có bộ biến toàn cục duy nhất của riêng họ.
Sử dụng C ++ namespace
và struct
Kỹ thuật cho C
Đối với ngôn ngữ lập trình C ++, lệnh namespace
này là một trợ giúp rất lớn trong việc giảm khả năng xảy ra xung đột tên. namespace
cùng với class
và các từ khóa truy cập khác nhau ( private
, protected
và public
) cung cấp hầu hết các công cụ cần thiết để biến Encapsulate. Tuy nhiên, ngôn ngữ lập trình C không cung cấp chỉ thị này. Bài đăng stackoverflow này, Không gian tên trong C , cung cấp một số kỹ thuật cho C.
Một kỹ thuật hữu ích là có một vùng dữ liệu lưu trú bộ nhớ duy nhất được xác định là vùng struct
có khả năng hiển thị toàn cầu và trong đó struct
là các con trỏ tới các biến và hàm toàn cầu khác nhau đang được hiển thị. Các định nghĩa thực tế của các biến toàn cục được đưa ra phạm vi tệp bằng cách sử dụng static
từ khóa. Nếu sau đó bạn sử dụng const
từ khóa để chỉ ra cái nào chỉ đọc, trình biên dịch có thể giúp bạn thực thi quyền truy cập chỉ đọc.
Sử dụng struct
kỹ thuật cũng có thể gói gọn toàn cầu để nó trở thành một loại gói hoặc thành phần xảy ra là toàn cầu. Bằng cách có một thành phần của loại này, việc quản lý các thay đổi có ảnh hưởng đến toàn cầu và chức năng sử dụng toàn cầu trở nên dễ dàng hơn.
Tuy nhiên, trong khi namespace
hoặc struct
kỹ thuật có thể giúp quản lý xung đột tên, các vấn đề tiềm ẩn của khớp nối giữa các thành phần mà việc sử dụng toàn cầu giới thiệu đặc biệt là trong một ứng dụng đa luồng hiện đại, vẫn tồn tại.
Biến toàn cầu cũng tệ như bạn tạo ra chúng, không hơn không kém.
Nếu bạn đang tạo một chương trình được đóng gói đầy đủ, bạn có thể sử dụng toàn cầu. Đó là một "tội lỗi" khi sử dụng toàn cầu, nhưng tội lỗi lập trình là triết lý tồi tệ.
Nếu bạn kiểm tra L.in. Tomb , bạn sẽ thấy một ngôn ngữ có các biến duy nhất là toàn cầu. Không thể quét được vì tất cả các thư viện không có lựa chọn nào khác ngoài sử dụng toàn cầu.
Điều đó nói rằng, nếu bạn có lựa chọn và có thể bỏ qua triết lý lập trình viên, toàn cầu sẽ không tệ đến thế.
Không phải là Gotos, nếu bạn sử dụng chúng đúng.
Vấn đề "xấu" lớn là, nếu bạn sử dụng sai, mọi người la hét, tàu đổ bộ của sao hỏa, và thế giới nổ tung .... hoặc một cái gì đó tương tự.
Có, nhưng bạn không phải chịu chi phí cho các biến toàn cục cho đến khi bạn ngừng làm việc trong mã sử dụng biến toàn cục và bắt đầu viết một cái gì đó sử dụng mã sử dụng biến toàn cục. Nhưng chi phí vẫn còn đó.
Nói cách khác, đó là một chi phí gián tiếp dài hạn và như vậy hầu hết mọi người nghĩ rằng nó không tệ.
Nếu có thể, mã của bạn sẽ được xem xét chuyên sâu trong phiên tòa của Tòa án tối cao , thì bạn muốn chắc chắn tránh các biến toàn cục.
Xem bài viết này: Mã ống thở Buggy phản ánh tầm quan trọng của đánh giá nguồn
Có một số vấn đề với phong cách của mã được xác định bởi cả hai nghiên cứu. Một trong những vấn đề phong cách mà các nhà đánh giá quan tâm là việc sử dụng rộng rãi các biến toàn cầu không được bảo vệ . Đây được coi là hình thức kém vì nó làm tăng nguy cơ rằng trạng thái chương trình sẽ trở nên không nhất quán hoặc các giá trị sẽ vô tình bị sửa đổi hoặc ghi đè. Các nhà nghiên cứu cũng bày tỏ một số lo ngại về thực tế là độ chính xác thập phân không được duy trì nhất quán trong toàn bộ mã.
Man, tôi cá rằng những nhà phát triển đang ước họ đã không sử dụng các biến toàn cầu!
Tôi sẽ trả lời câu hỏi này bằng một câu hỏi khác: Bạn có sử dụng singeltons / Singeltons có tệ không?
Bởi vì (hầu hết tất cả) việc sử dụng singelton là một biến toàn cầu được tôn vinh.
Vấn đề ít hơn là chúng xấu , và nhiều hơn là chúng nguy hiểm . Họ có những ưu và nhược điểm riêng, và có những tình huống là cách hiệu quả nhất hoặc duy nhất để đạt được một nhiệm vụ cụ thể. Tuy nhiên, chúng rất dễ bị lạm dụng, ngay cả khi bạn thực hiện các bước để luôn sử dụng chúng đúng cách.
Một vài ưu điểm:
Một vài nhược điểm:
Lưu ý, nếu bạn muốn, hai ưu điểm đầu tiên và hai nhược điểm đầu tiên tôi liệt kê là giống hệt nhau, chỉ với cách diễn đạt khác nhau. Điều này là do các tính năng của một biến toàn cục thực sự có thể hữu ích, nhưng chính các tính năng làm cho chúng hữu ích là nguồn gốc của tất cả các vấn đề của chúng.
Một vài giải pháp tiềm năng cho một số vấn đề:
Globals
hay GlobalVars
), hoặc sử dụng một quy ước đặt tên chuẩn tắc dùng cho các biến toàn cục (như global_[name]
hay g_module_varNameStyle
(như đã đề cập bởi underscore_d trong các ý kiến )). Điều này sẽ ghi lại cả việc sử dụng chúng (bạn có thể tìm mã sử dụng các biến toàn cục bằng cách tìm kiếm không gian tên / tên cấu trúc) và giảm thiểu tác động lên không gian tên toàn cầu.extern
trong tiêu đề được liên kết, vì vậy việc sử dụng chúng có thể bị giới hạn ở các đơn vị biên dịch cần truy cập chúng. Nếu mã của bạn phụ thuộc vào rất nhiều biến toàn cục, nhưng mỗi đơn vị biên dịch chỉ cần truy cập vào một số trong số chúng, bạn có thể xem xét sắp xếp chúng thành nhiều tệp nguồn, do đó, việc giới hạn quyền truy cập của mỗi tệp vào các biến toàn cục sẽ dễ dàng hơn.Cho dù chúng tốt hay xấu phụ thuộc vào cách bạn sử dụng chúng. Phần lớn có xu hướng sử dụng chúng một cách tồi tệ, do đó sự cảnh giác chung đối với họ. Nếu được sử dụng đúng cách, chúng có thể là một lợi ích lớn; tuy nhiên, nếu được sử dụng kém, chúng có thể và sẽ quay lại cắn bạn khi nào và như thế nào bạn ít mong đợi nhất.
Một cách tốt để xem xét là bản thân chúng không xấu, nhưng chúng cho phép thiết kế xấu và có thể nhân lên các hiệu ứng của thiết kế xấu theo cấp số nhân.
Ngay cả khi bạn không có ý định sử dụng chúng, tốt hơn là nên biết cách sử dụng chúng một cách an toàn và chọn không sử dụng, hơn là không sử dụng chúng vì bạn không biết cách sử dụng chúng một cách an toàn. Nếu bạn từng thấy mình trong tình huống cần duy trì mã có sẵn dựa trên các biến toàn cục, bạn có thể gặp khó khăn nếu bạn không biết cách sử dụng chúng đúng cách.
g_module_varNameStyle
hoàn toàn dễ đọc. Để được rõ ràng, tôi không sử dụng globals nếu tôi có thể tránh nó một cách dễ dàng - từ khóa một cách dễ dàng , bởi vì kể từ khi tôi ngừng tin rằng họ phải tránh - hay đúng hơn là obfuscated - bằng mọi giá, tôi có một thời gian tốt hơn nhiều, & tôi mã là (sốc!) xa hơn
Như ai đó đã nói (tôi đang diễn giải) trong một chủ đề khác "Các quy tắc như thế này không nên bị phá vỡ, cho đến khi bạn hoàn toàn hiểu hậu quả của việc đó."
Đôi khi, các biến toàn cục là cần thiết hoặc ít nhất là rất hữu ích (Làm việc với các cuộc gọi lại do hệ thống xác định chẳng hạn). Mặt khác, chúng cũng rất nguy hiểm vì tất cả những lý do bạn đã nói.
Có nhiều khía cạnh của lập trình có lẽ nên để lại cho các chuyên gia. Đôi khi bạn CẦN một con dao rất sắc. Nhưng bạn không được sử dụng nó cho đến khi bạn sẵn sàng ...
Các biến toàn cục nói chung là xấu, đặc biệt là nếu những người khác đang làm việc trên cùng một mã và không muốn mất 20 phút để tìm kiếm tất cả các vị trí mà biến được tham chiếu. Và việc thêm các chủ đề sửa đổi các biến mang đến một mức độ đau đầu hoàn toàn mới.
Các hằng số toàn cầu trong một không gian tên ẩn danh được sử dụng trong một đơn vị dịch thuật là tốt và có mặt khắp nơi trong các ứng dụng và thư viện chuyên nghiệp. Nhưng nếu dữ liệu có thể thay đổi và / hoặc nó phải được chia sẻ giữa nhiều TU, bạn có thể muốn gói gọn nó - nếu không phải vì mục đích thiết kế, thì vì lợi ích của bất kỳ ai gỡ lỗi hoặc làm việc với mã của bạn.
Sử dụng các biến toàn cục giống như quét bụi bẩn dưới tấm thảm. Đó là một cách khắc phục nhanh chóng và dễ dàng hơn rất nhiều trong thời gian ngắn hơn là lấy một chiếc chảo bụi hoặc máy hút bụi để làm sạch nó. Tuy nhiên, nếu bạn không bao giờ kết thúc việc di chuyển tấm thảm sau đó, bạn sẽ có một mớ hỗn độn bất ngờ lớn bên dưới.
Tôi nghĩ rằng giáo sư của bạn đang cố gắng ngăn chặn một thói quen xấu trước khi nó bắt đầu.
Các biến toàn cầu có vị trí của chúng và giống như nhiều người nói rằng việc biết sử dụng chúng ở đâu và khi nào có thể phức tạp. Vì vậy, tôi nghĩ thay vì đi sâu vào lý do tại sao, làm thế nào, khi nào và ở đâu các biến toàn cầu mà giáo sư của bạn quyết định chỉ cấm. Ai biết được, anh ta có thể cấm họ trong tương lai.
Tuyệt đối không. Lạm dụng chúng mặc dù ... đó là xấu.
Vô thức loại bỏ chúng vì lợi ích của nó chỉ là ... vô trí. Trừ khi bạn biết những ưu điểm và nhược điểm, tốt nhất là chỉ đạo rõ ràng và làm như bạn đã được dạy / học, nhưng không có gì sai với các biến toàn cầu. Khi bạn hiểu những ưu và khuyết điểm tốt hơn hãy đưa ra quyết định của riêng bạn.
Biến toàn cầu là tốt trong các chương trình nhỏ, nhưng thật kinh khủng nếu được sử dụng theo cách tương tự trong các chương trình lớn.
Điều này có nghĩa là bạn có thể dễ dàng có thói quen sử dụng chúng trong khi học. Đây là những gì giáo sư của bạn đang cố gắng bảo vệ bạn khỏi.
Khi bạn có nhiều kinh nghiệm sẽ dễ học hơn khi họ ổn.
Không, họ không tệ chút nào. Bạn cần xem mã (máy) do trình biên dịch tạo ra để đưa ra quyết định này, đôi khi việc sử dụng cục bộ còn tệ hơn nhiều so với toàn cầu. Cũng lưu ý rằng việc đặt "tĩnh" trên một biến cục bộ về cơ bản làm cho nó trở thành toàn cầu (và tạo ra các vấn đề xấu khác mà toàn cầu thực sự sẽ giải quyết). "toàn cầu địa phương" là đặc biệt xấu.
Globals cung cấp cho bạn quyền kiểm soát sạch đối với việc sử dụng bộ nhớ của bạn, một điều khó khăn hơn nhiều đối với người dân địa phương. Những ngày này chỉ quan trọng trong môi trường nhúng, nơi bộ nhớ khá hạn chế. Một số điều cần biết trước khi bạn cho rằng nhúng giống như các môi trường khác và giả sử các quy tắc lập trình là giống nhau trên bảng.
Thật tốt khi bạn đặt câu hỏi về các quy tắc được dạy, hầu hết chúng không phải là lý do bạn được nói. Bài học quan trọng nhất không phải là đây là một quy tắc để mang theo bạn mãi mãi, nhưng đây là một quy tắc bắt buộc phải tôn vinh để vượt qua lớp học này và tiến về phía trước. Trong cuộc sống, bạn sẽ thấy rằng đối với công ty XYZ, bạn sẽ có các quy tắc lập trình khác mà cuối cùng bạn sẽ phải tôn trọng để tiếp tục nhận được một mức lương. Trong cả hai tình huống bạn có thể tranh luận về quy tắc, nhưng tôi nghĩ bạn sẽ gặp may mắn hơn trong công việc so với ở trường. Bạn chỉ là một trong số nhiều sinh viên, chỗ ngồi của bạn sẽ sớm được thay thế, các giáo sư sẽ không, trong một công việc bạn là một trong những nhóm người chơi nhỏ phải xem sản phẩm này đến cùng và trong môi trường đó các quy tắc được phát triển là dành cho lợi ích của các thành viên trong nhóm cũng như sản phẩm và công ty, Vì vậy, nếu mọi người đều có cùng suy nghĩ hoặc nếu sản phẩm cụ thể có lý do kỹ thuật tốt để vi phạm điều bạn học được ở trường đại học hoặc một số cuốn sách về lập trình chung, thì hãy bán ý tưởng của bạn cho nhóm và viết nó thành một phương pháp hợp lệ nếu không phải là phương pháp ưa thích . Tất cả mọi thứ là trò chơi công bằng trong thế giới thực.
Nếu bạn tuân theo tất cả các quy tắc lập trình được dạy cho bạn ở trường hoặc sách thì sự nghiệp lập trình của bạn sẽ vô cùng hạn chế. Bạn có thể sống sót và có một sự nghiệp hiệu quả, nhưng bề rộng và chiều rộng của môi trường dành cho bạn sẽ vô cùng hạn chế. Nếu bạn biết làm thế nào và tại sao quy tắc ở đó và có thể bảo vệ nó, điều đó tốt, nếu bạn chỉ có lý do là "bởi vì giáo viên của tôi đã nói như vậy", điều đó không tốt lắm.
Lưu ý rằng các chủ đề như thế này thường được tranh luận tại nơi làm việc và sẽ tiếp tục, vì trình biên dịch và bộ xử lý (và ngôn ngữ) phát triển nên các loại quy tắc này và không bảo vệ vị trí của bạn và có thể được dạy bởi một người có ý kiến khác mà bạn sẽ không dạy tiến về phía trước.
Trong lúc này, sau đó chỉ cần làm bất cứ điều gì người nói to nhất hoặc mang cây gậy lớn nhất nói (cho đến khi bạn là người hét to nhất và mang cây gậy lớn nhất).
Tôi muốn tranh luận về quan điểm được đưa ra trong suốt chủ đề này rằng nó làm cho đa luồng trở nên khó hơn hoặc không thể thực hiện được. Các biến toàn cục được chia sẻ trạng thái, nhưng các lựa chọn thay thế cho toàn cầu (ví dụ: chuyển con trỏ xung quanh) cũng có thể chia sẻ trạng thái. Vấn đề với đa luồng là làm thế nào để sử dụng đúng trạng thái chia sẻ, chứ không phải là trạng thái đó có được chia sẻ thông qua một biến toàn cục hay một cái gì khác.
Hầu hết thời gian khi bạn thực hiện đa luồng, bạn cần chia sẻ một cái gì đó. Ví dụ, trong mẫu nhà sản xuất-người tiêu dùng, bạn có thể chia sẻ một số hàng đợi an toàn luồng có chứa các đơn vị công việc. Và bạn được phép chia sẻ nó vì cấu trúc dữ liệu đó là an toàn cho chuỗi. Cho dù hàng đợi đó là toàn cầu hay không hoàn toàn không liên quan khi nói đến an toàn luồng.
Hy vọng ngụ ý được thể hiện trong suốt chủ đề này rằng việc chuyển đổi một chương trình từ đơn luồng sang đa luồng sẽ dễ dàng hơn khi không sử dụng toàn cầu là ngây thơ. Vâng, toàn cầu giúp bạn dễ dàng tự bắn vào chân mình, nhưng có rất nhiều cách để tự bắn.
Tôi không ủng hộ toàn cầu, vì các điểm khác vẫn đứng vững, quan điểm của tôi chỉ là số lượng luồng trong một chương trình không liên quan gì đến phạm vi biến.
Có, bởi vì nếu bạn để các lập trình viên không đủ năng lực sử dụng chúng (đọc 90% đặc biệt là các nhà khoa học), bạn sẽ kết thúc với hơn 600 biến toàn cầu trải rộng trên 20 tệp và một dự án gồm 12.000 dòng trong đó 80% hàm bị mất, trả về trống và hoạt động hoàn toàn trên nhà nước toàn cầu.
Nó nhanh chóng trở nên không thể hiểu những gì đang diễn ra tại bất kỳ thời điểm nào trừ khi bạn biết toàn bộ dự án.
Sử dụng các biến toàn cầu thực sự phụ thuộc vào các yêu cầu. Ưu điểm của nó là, nó giảm chi phí truyền lại các giá trị nhiều lần.
Nhưng giáo sư của bạn là đúng bởi vì nó làm tăng các vấn đề bảo mật vì vậy nên tránh sử dụng các biến toàn cục càng nhiều càng tốt. Các biến toàn cục cũng tạo ra các vấn đề đôi khi khó gỡ lỗi .
Ví dụ:-
Các tình huống khi các giá trị biến đang được sửa đổi trong thời gian chạy . Tại thời điểm đó, rất khó để xác định phần nào của mã đang sửa đổi nó và với điều kiện nào.
Toàn cầu là tốt khi nói đến cấu hình . Khi chúng ta muốn chúng tôi cấu hình / thay đổi để có một tác động toàn cầu trên toàn bộ dự án .
Vì vậy, chúng tôi có thể thay đổi một cấu hình và các thay đổi được hướng đến toàn bộ dự án . Nhưng tôi phải cảnh báo bạn sẽ phải rất thông minh để sử dụng toàn cầu.
Sớm hay muộn bạn sẽ cần thay đổi cách đặt biến đó hoặc điều gì xảy ra khi nó được truy cập, hoặc bạn chỉ cần tìm ra nơi nó được thay đổi.
Thực tế luôn luôn tốt hơn để không có các biến toàn cầu. Chỉ cần viết các phương thức nhận và thiết lập đập, và nói với bạn khi bạn cần chúng một ngày, tuần hoặc tháng sau.
Tôi thường sử dụng toàn cầu cho các giá trị hiếm khi được thay đổi như singletons hoặc con trỏ hàm thành các hàm trong thư viện được tải động. Sử dụng các quả cầu có thể thay đổi trong các ứng dụng đa luồng có xu hướng dẫn đến lỗi khó theo dõi vì vậy tôi cố gắng tránh điều này như một quy tắc chung.
Sử dụng toàn cầu thay vì truyền đối số thường nhanh hơn nhưng nếu bạn đang viết một ứng dụng đa luồng, điều mà bạn thường làm hiện nay, thì nó thường không hoạt động tốt (bạn có thể sử dụng thống kê luồng nhưng sau đó hiệu suất đạt được là đáng ngờ) .
Trong các ứng dụng web trong enterprize có thể được sử dụng để lưu dữ liệu cụ thể của phiên / cửa sổ / luồng / người dùng trên máy chủ vì lý do tối ưu hóa và để bảo vệ chống mất công việc khi kết nối không ổn định. Như đã đề cập, điều kiện cuộc đua cần phải được xử lý. Chúng tôi sử dụng một ví dụ duy nhất của một lớp cho thông tin này và nó được quản lý cẩn thận.
Vào cuối ngày, chương trình hoặc ứng dụng của bạn vẫn có thể hoạt động nhưng vấn đề là gọn gàng và có sự hiểu biết đầy đủ về những gì đang diễn ra. Nếu bạn chia sẻ một giá trị biến trong số tất cả các hàm, có thể khó theo dõi hàm nào đang thay đổi giá trị (nếu hàm làm như vậy) và khiến việc gỡ lỗi khó hơn gấp triệu lần
bảo mật ít hơn có nghĩa là bất kỳ ai cũng có thể thao túng các biến nếu chúng được khai báo toàn cầu, vì điều này để giải thích lấy ví dụ này nếu bạn có số dư là biến toàn cầu trong chương trình ngân hàng của mình, chức năng người dùng có thể thao túng điều này cũng như nhân viên ngân hàng cũng có thể thao túng Điều này do đó có một vấn đề. Người dùng chỉ nên được cung cấp chức năng chỉ đọc và rút tiền nhưng nhân viên ngân hàng có thể thêm số tiền khi cá nhân người dùng đưa tiền vào bàn. Đây là cách nó hoạt động
Trong một ứng dụng đa luồng, sử dụng các biến cục bộ thay cho các biến toàn cục để tránh tình trạng chủng tộc.
Một điều kiện cuộc đua xảy ra khi nhiều luồng truy cập vào một tài nguyên được chia sẻ, với ít nhất một luồng có quyền truy cập ghi vào dữ liệu. Sau đó, kết quả của chương trình là không thể dự đoán được, và phụ thuộc vào thứ tự truy cập dữ liệu theo các luồng khác nhau.
Thông tin thêm về điều này tại đây, https://software.intel.com/en-us/articles/use-intel-abul-inspector-to-find-race-conditions-in-openmp-basing-multithreaded-code